https://www.tutorialspoint.com/sqlite/index.htm

사용법과 설명등이 잘되어있다.

 

 

'DB' 카테고리의 다른 글

(SQLite) SQLite 공부하기 좋은 사이트  (0) 2018.03.07
SQLite Bulk Insert  (0) 2018.03.07
(SQLite) 속도향상 - 링크  (0) 2018.03.01
(Oracle) UNPIVOT  (1) 2018.02.20
(SQLite) insert 쿼리 수행 속도 높이기  (3) 2018.01.20
SQLite 참고 링크 모음  (1) 2017.11.23

SQLite Bulk Insert In C#/.NET

Recently, I had a project where I needed to load 1 million+ records into a SQLite database. I downloaded the SQLite ADO.NET adapter and setup the Entity framework to map to my SQLite database. All was simple and all was well!

I started inserting the data into my database; lo and behold, it was taking forever! In fact, it took most of a full working day to insert my data. I knew something wasn't right. A simple Google search pointed me to the SQLite FAQ. It turns out that SQLite wraps every INSERT into a transaction. Simple solution: start a transaction and perform multiple INSERTs. I needed my inserts to be fast, so I just had to write a class to encapsulate this.

It's very simple to use. Make sure that your SQLite database file has been created and your table has been created as well.

Let's assume your database schema looks like the following: Id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, LastName VARCHAR(16) NOT NULL, Height REAL NOT NULL

You would then use SQLiteBulkInsert as follows:

SQLiteBulkInsert sbi = new SQLiteBulkInsert(yourDatabaseConnectionObject, "yourTableName");
sbi.AddParameter("LastName", DbType.String);
sbi.AddParameter("Height", DbType.Single);

You can then insert records:

for (int x = 0; x < 10000; x++)
    sbi.Insert(new object[]{someString, someFloat});
sbi.Flush();

That's it! You should look at the file SQLiteBulkInsertTest.cs for more details. SQLiteBulkInsert.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SQLite;
using System.Data;

namespace YourProject.Data.SQLite
{
    public class SQLiteBulkInsert
    {
        private SQLiteConnection m_dbCon;
        private SQLiteCommand m_cmd;
        private SQLiteTransaction m_trans;

        private Dictionary m_parameters = new Dictionary();

        private uint m_counter = 0;

        private string m_beginInsertText;

        public SQLiteBulkInsert(SQLiteConnection dbConnection, string tableName) {
            m_dbCon = dbConnection;
            m_tableName = tableName;

            StringBuilder query = new StringBuilder(255);
            query.Append("INSERT INTO ["); query.Append(tableName); query.Append("] (");
            m_beginInsertText = query.ToString();
        }

        private bool m_allowBulkInsert = true;
        public bool AllowBulkInsert { get { return m_allowBulkInsert; } set { m_allowBulkInsert = value; } }

        public string CommandText {
            get {
                if (m_parameters.Count < 1)
                    throw new SQLiteException("You must add at least one parameter.");

                StringBuilder sb = new StringBuilder(255);
                sb.Append(m_beginInsertText);

                foreach (string param in m_parameters.Keys) {
                    sb.Append('[');
                    sb.Append(param);
                    sb.Append(']');
                    sb.Append(", ");
                }
                sb.Remove(sb.Length - 2, 2);

                sb.Append(") VALUES (");

                foreach (string param in m_parameters.Keys) {
                    sb.Append(m_paramDelim);
                    sb.Append(param);
                    sb.Append(", ");
                }
                sb.Remove(sb.Length - 2, 2);

                sb.Append(")");

                return sb.ToString();
            }
        }

        private uint m_commitMax = 10000;
        public uint CommitMax { get { return m_commitMax; } set { m_commitMax = value; } }

        private string m_tableName;
        public string TableName { get { return m_tableName; } }

        private string m_paramDelim = ":";
        public string ParamDelimiter { get { return m_paramDelim; } }

        public void AddParameter(string name, DbType dbType) {
            SQLiteParameter param = new SQLiteParameter(m_paramDelim + name, dbType);
            m_parameters.Add(name, param);
        }

        public void Flush() {
            try {
                if (m_trans != null)
                    m_trans.Commit();
            }
            catch (Exception ex) { throw new Exception("Could not commit transaction. See InnerException for more details", ex); }
            finally {
                if (m_trans != null)
                    m_trans.Dispose();

                m_trans = null;
                m_counter = 0;
            }
        }

        public void Insert(object[] paramValues) {
            if (paramValues.Length != m_parameters.Count)
                throw new Exception("The values array count must be equal to the count of the number of parameters.");

            m_counter++;

            if (m_counter == 1) {
                if (m_allowBulkInsert)
                    m_trans = m_dbCon.BeginTransaction();

                m_cmd = m_dbCon.CreateCommand();
                foreach (SQLiteParameter par in m_parameters.Values)
                    m_cmd.Parameters.Add(par);

                m_cmd.CommandText = this.CommandText;
            }

            int i = 0;
            foreach (SQLiteParameter par in m_parameters.Values) {
                par.Value = paramValues[i];
                i++;
            }

            m_cmd.ExecuteNonQuery();

            if (m_counter == m_commitMax) {
                try {
                    if (m_trans != null)
                        m_trans.Commit();
                }
                catch (Exception ex) { }
                finally {
                    if (m_trans != null) {
                        m_trans.Dispose();
                        m_trans = null;
                    }

                    m_counter = 0;
                }
            }
        }
    }
}

SQLiteBulkInsertTest.cs:

using YourProject.Data.SQLite;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Data.SQLite;
using System.Data;
using System.IO;
using System;

namespace TestYourProject
{
    /// 
    ///This is a test class for SQLiteBulkInsertTest and is intended
    ///to contain all SQLiteBulkInsertTest Unit Tests
    ///
    [TestClass()]
    public class SQLiteBulkInsertTest
    {
        private static string m_testDir;
        private static string m_testFile;
        private static string m_testTableName = "test_table";
        private static string m_connectionString;

        private static string m_deleteAllQuery = "DELETE FROM [{0}]";
        private static string m_countAllQuery = "SELECT COUNT(id) FROM [{0}]";
        private static string m_selectAllQuery = "SELECT * FROM [{0}]";

        private static SQLiteConnection m_dbCon;
        private static SQLiteCommand m_deleteAllCmd;
        private static SQLiteCommand m_countAllCmd;
        private static SQLiteCommand m_selectAllCmd;

        private TestContext testContextInstance;

        /// 
        ///Gets or sets the test context which provides
        ///information about and functionality for the current test run.
        ///
        public TestContext TestContext {
            get {
                return testContextInstance;
            }
            set {
                testContextInstance = value;
            }
        }

        #region Additional test attributes
        //
        //You can use the following additional attributes as you write your tests:
        //
        //Use ClassInitialize to run code before running the first test in the class
        [ClassInitialize()]
        public static void MyClassInitialize(TestContext testContext){
            Random rand = new Random(Environment.TickCount);
            int rn = rand.Next(0, int.MaxValue);
            m_testDir = @"C:\SqliteBulkInsertTest-" + rn + @"\";
            m_testFile = m_testDir + "db.sqlite";

            if (!Directory.Exists(m_testDir))
                Directory.CreateDirectory(m_testDir);

            if (!File.Exists(m_testFile)) {
                FileStream fs = File.Create(m_testFile);
                fs.Close();
            }

            m_connectionString = string.Format(@"data source={0};datetimeformat=Ticks", m_testFile);
            m_dbCon = new SQLiteConnection(m_connectionString);
            m_dbCon.Open();

            SQLiteCommand cmd = m_dbCon.CreateCommand();
            string query = "CREATE TABLE IF NOT EXISTS [{0}] (id INTEGER PRIMARY KEY AUTOINCREMENT, somestring VARCHAR(16), somereal REAL, someint INTEGER(4), somedt DATETIME)";
            query = string.Format(query, m_testTableName);
            cmd.CommandText = query;
            cmd.ExecuteNonQuery();
        }
        //
        //Use ClassCleanup to run code after all tests in a class have run
        [ClassCleanup()]
        public static void MyClassCleanup(){
            m_dbCon.Close();

            File.Delete(m_testFile);
            Directory.Delete(m_testDir);
        }
        #endregion

        private void AddParameters(SQLiteBulkInsert target) {
            target.AddParameter("somestring", DbType.String);
            target.AddParameter("somereal", DbType.String);
            target.AddParameter("someint", DbType.Int32);
            target.AddParameter("somedt", DbType.DateTime);
        }

        private long CountRecords() {
            m_countAllCmd = m_dbCon.CreateCommand();
            m_countAllCmd.CommandText = string.Format(m_countAllQuery, m_testTableName);

            long ret = (long)m_countAllCmd.ExecuteScalar();
            m_countAllCmd.Dispose();

            return ret;
        }

        private void DeleteRecords() {
            m_deleteAllCmd = m_dbCon.CreateCommand();
            m_deleteAllCmd.CommandText = string.Format(m_deleteAllQuery, m_testTableName);

            m_deleteAllCmd.ExecuteNonQuery();
            m_deleteAllCmd.Dispose();
        }

        private SQLiteDataReader SelectAllRecords() {
            m_selectAllCmd = m_dbCon.CreateCommand();
            m_selectAllCmd.CommandText = string.Format(m_selectAllQuery, m_testTableName);
            return m_selectAllCmd.ExecuteReader();
        }

        [TestMethod()]
        public void AddParameterTest() {
            SQLiteBulkInsert target = new SQLiteBulkInsert(m_dbCon, m_testTableName);
            AddParameters(target);

            string pd = target.ParamDelimiter;
            string expectedStmnt = "INSERT INTO [{0}] ([somestring], [somereal], [someint], [somedt]) VALUES ({1}somestring, {2}somereal, {3}someint, {4}somedt)";
            expectedStmnt = string.Format(expectedStmnt, m_testTableName, pd, pd, pd, pd);
            Assert.AreEqual(expectedStmnt, target.CommandText);
        }

        [TestMethod()]
        public void SQLiteBulkInsertConstructorTest() {
            SQLiteBulkInsert target = new SQLiteBulkInsert(m_dbCon, m_testTableName);
            Assert.AreEqual(m_testTableName, target.TableName);

            bool wasException = false;
            try {
                string a = target.CommandText;
            }
            catch (SQLiteException ex) { wasException = true; }

            Assert.IsTrue(wasException);
        }

        [TestMethod()]
        public void CommandTextTest() {
            SQLiteBulkInsert target = new SQLiteBulkInsert(m_dbCon, m_testTableName);
            AddParameters(target);

            string pd = target.ParamDelimiter;
            string expectedStmnt = "INSERT INTO [{0}] ([somestring], [somereal], [someint], [somedt]) VALUES ({1}somestring, {2}somereal, {3}someint, {4}somedt)";
            expectedStmnt = string.Format(expectedStmnt, m_testTableName, pd, pd, pd, pd);
            Assert.AreEqual(expectedStmnt, target.CommandText);
        }

        [TestMethod()]
        public void TableNameTest() {
            SQLiteBulkInsert target = new SQLiteBulkInsert(m_dbCon, m_testTableName);
            Assert.AreEqual(m_testTableName, target.TableName);
        }

        [TestMethod()]
        public void InsertTest() {
            SQLiteBulkInsert target = new SQLiteBulkInsert(m_dbCon, m_testTableName);

            bool didThrow = false;
            try {
                target.Insert(new object[] { "hello" }); //object.length must equal the number of parameters added
            }
            catch (Exception ex) { didThrow = true; }
            Assert.IsTrue(didThrow);

            AddParameters(target);

            target.CommitMax = 4;
            DateTime dt1 = DateTime.Now; DateTime dt2 = DateTime.Now; DateTime dt3 = DateTime.Now; DateTime dt4 = DateTime.Now;
            target.Insert(new object[] { "john", 3.45f, 10, dt1 });
            target.Insert(new object[] { "paul", -0.34f, 100, dt2 });
            target.Insert(new object[] { "ringo", 1000.98f, 1000, dt3 });
            target.Insert(new object[] { "george", 5.0f, 10000, dt4 });

            long count = CountRecords();
            Assert.AreEqual(4, count);

            SQLiteDataReader reader = SelectAllRecords();

            Assert.IsTrue(reader.Read());
            Assert.AreEqual("john", reader.GetString(1)); Assert.AreEqual(3.45f, reader.GetFloat(2));
            Assert.AreEqual(10, reader.GetInt32(3)); Assert.AreEqual(dt1, reader.GetDateTime(4));

            Assert.IsTrue(reader.Read());
            Assert.AreEqual("paul", reader.GetString(1)); Assert.AreEqual(-0.34f, reader.GetFloat(2));
            Assert.AreEqual(100, reader.GetInt32(3)); Assert.AreEqual(dt2, reader.GetDateTime(4));

            Assert.IsTrue(reader.Read());
            Assert.AreEqual("ringo", reader.GetString(1)); Assert.AreEqual(1000.98f, reader.GetFloat(2));
            Assert.AreEqual(1000, reader.GetInt32(3)); Assert.AreEqual(dt3, reader.GetDateTime(4));

            Assert.IsTrue(reader.Read());
            Assert.AreEqual("george", reader.GetString(1)); Assert.AreEqual(5.0f, reader.GetFloat(2));
            Assert.AreEqual(10000, reader.GetInt32(3)); Assert.AreEqual(dt4, reader.GetDateTime(4));

            Assert.IsFalse(reader.Read());

            DeleteRecords();

            count = CountRecords();
            Assert.AreEqual(0, count);
        }

        [TestMethod()]
        public void FlushTest() {
            string[] names = new string[] { "metalica", "beatles", "coldplay", "tiesto", "t-pain", "blink 182", "plain white ts", "staind", "pink floyd" };
            Random rand = new Random(Environment.TickCount);

            SQLiteBulkInsert target = new SQLiteBulkInsert(m_dbCon, m_testTableName);
            AddParameters(target);

            target.CommitMax = 1000;

            //Insert less records than commitmax
            for (int x = 0; x < 50; x++)
                target.Insert(new object[] { names[rand.Next(names.Length)], (float)rand.NextDouble(), rand.Next(50), DateTime.Now });

            //Close connect to verify records were not inserted
            m_dbCon.Close();

            m_dbCon = new SQLiteConnection(m_connectionString);
            m_dbCon.Open();

            long count = CountRecords();
            Assert.AreEqual(0, count);

            //Now actually verify flush worked
            target = new SQLiteBulkInsert(m_dbCon, m_testTableName);
            AddParameters(target);

            target.CommitMax = 1000;

            //Insert less records than commitmax
            for (int x = 0; x < 50; x++)
                target.Insert(new object[] { names[rand.Next(names.Length)], (float)rand.NextDouble(), rand.Next(50), DateTime.Now });

            target.Flush();

            count = CountRecords();
            Assert.AreEqual(50, count);

            //Close connect to verify flush worked
            m_dbCon.Close();

            m_dbCon = new SQLiteConnection(m_connectionString);
            m_dbCon.Open();

            count = CountRecords();
            Assert.AreEqual(50, count);

            DeleteRecords();
            count = CountRecords();
            Assert.AreEqual(0, count);
        }

        [TestMethod()]
        public void CommitMaxTest() {
            SQLiteBulkInsert target = new SQLiteBulkInsert(m_dbCon, m_testTableName);

            target.CommitMax = 4;
            Assert.AreEqual(4, target.CommitMax);

            target.CommitMax = 1000;
            Assert.AreEqual(1000, target.CommitMax);
        }

        //SPEED TEST
        [TestMethod()]
        public void AllowBulkInsertTest() {
            string[] names = new string[] { "metalica", "beatles", "coldplay", "tiesto", "t-pain", "blink 182", "plain white ts", "staind", "pink floyd"};
            Random rand = new Random(Environment.TickCount);

            SQLiteBulkInsert target = new SQLiteBulkInsert(m_dbCon, m_testTableName);
            AddParameters(target);

            const int COUNT = 100;

            target.CommitMax = COUNT;

            DateTime start1 = DateTime.Now;
            for (int x = 0; x < COUNT; x++)
                target.Insert(new object[] { names[rand.Next(names.Length)], (float)rand.NextDouble(), rand.Next(COUNT), DateTime.Now });

            DateTime end1 = DateTime.Now;
            TimeSpan delta1 = end1 - start1;

            DeleteRecords();

            target.AllowBulkInsert = false;
            DateTime start2 = DateTime.Now;
            for (int x = 0; x < COUNT; x++)
                target.Insert(new object[] { names[rand.Next(names.Length)], (float)rand.NextDouble(), rand.Next(COUNT), DateTime.Now });

            DateTime end2 = DateTime.Now;
            TimeSpan delta2 = end2 - start2;

            //THIS MAY FAIL DEPENDING UPON THE MACHINE THE TEST IS RUNNING ON.
            Assert.IsTrue(delta1.TotalSeconds < 0.1); //approx true for 100 recs             Assert.IsTrue(delta2.TotalSeconds > 1.0); //approx true for 100 recs;

            //UNCOMMENT THIS TO MAKE IT FAIL AND SEE ACTUAL NUMBERS IN FAILED REPORT
            //Assert.AreEqual(delta1.TotalSeconds, delta2.TotalSeconds);

            DeleteRecords();
        }
    }
}

 출처 : http://procbits.com/2009/09/08/sqlite-bulk-insert

'DB' 카테고리의 다른 글

(SQLite) SQLite 공부하기 좋은 사이트  (0) 2018.03.07
SQLite Bulk Insert  (0) 2018.03.07
(SQLite) 속도향상 - 링크  (0) 2018.03.01
(Oracle) UNPIVOT  (1) 2018.02.20
(SQLite) insert 쿼리 수행 속도 높이기  (3) 2018.01.20
SQLite 참고 링크 모음  (1) 2017.11.23

https://medium.com/@JasonWyatt/squeezing-performance-from-sqlite-insertions-971aff98eef2

 

http://blog.quibb.org/2010/08/fast-bulk-inserts-into-sqlite/

 

https://blogs.msdn.microsoft.com/andy_wigley/2013/11/21/how-to-massively-improve-sqlite-performance-using-sqlwinrt/

 

https://www.sqlite.org/fasterthanfs.html

 

* litedb

http://www.litedb.org/

 

* flat file database system

http://www.c-sharpcorner.com/UploadFile/e731e4/flatfile-database-system/

'DB' 카테고리의 다른 글

(SQLite) SQLite 공부하기 좋은 사이트  (0) 2018.03.07
SQLite Bulk Insert  (0) 2018.03.07
(SQLite) 속도향상 - 링크  (0) 2018.03.01
(Oracle) UNPIVOT  (1) 2018.02.20
(SQLite) insert 쿼리 수행 속도 높이기  (3) 2018.01.20
SQLite 참고 링크 모음  (1) 2017.11.23

Oracle 11g 부터 제공되는 UNPIVOT 명령어가 있는데

일일히 UNPIVOT 쿼리를 만들어 내지 않고 쉽게 UNPIVOT 을 할수 있다.

그런데 속도가 느리다 ㅜㅠ

하여 찾아보니 아래처럼 하면 속도가 10배나 빨라진다고 하는데..

한번 시도해 봐야겠다.

 

WITH base as (select my_data, ...) select * from base UNPIVOT (...)

'DB' 카테고리의 다른 글

SQLite Bulk Insert  (0) 2018.03.07
(SQLite) 속도향상 - 링크  (0) 2018.03.01
(Oracle) UNPIVOT  (1) 2018.02.20
(SQLite) insert 쿼리 수행 속도 높이기  (3) 2018.01.20
SQLite 참고 링크 모음  (1) 2017.11.23
SQLite 공유 캐시 모드  (0) 2017.08.24
  1. Favicon of http://kjun.kr kjun.kr 2018.03.05 12:55 신고

    속도가 10배이상 빨라졌다 위 방법을 추천한다

1. transaction 으로 묶어서 처리한다.

2. cash_size 값 변경 (예:1000)

3. page_size 값 변경 (예:2048)

4. journal_mode=wal

5. temp_store=memory

6. synchronous=off

  1. Favicon of http://kjun.kr kjun.kr 2018.03.07 14:51 신고

    https://www.tutorialspoint.com/sqlite/sqlite_c_cpp.htm

  2. Favicon of http://kjun.kr kjun.kr 2018.03.07 14:52 신고

    https://github.com/SRombauts/SQLiteCpp

  3. Favicon of http://kjun.kr kjun.kr 2018.03.07 14:53 신고

    http://igotit.tistory.com/entry/Visual-C-%EC%97%90%EC%84%9C-SQLite-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%ED%99%9C%EC%9A%A9%ED%95%98%EA%B8%B0

http://gywn.net/category/sqlite/
http://egloos.zum.com/ysbulpe/v/2282868
https://www.codeproject.com/Articles/746191/SQLite-Helper-Csharp
https://stackoverflow.com/questions/5367118/how-perform-sqlite-query-with-a-data-reader-without-locking-database
http://www.sqlite.org/wal.html
http://nocode.tistory.com/95
http://aroundck.tistory.com/3032
http://hooonko.tumblr.com/post/15392179011/sqlite-write-ahead-logging-%EB%B2%88%EC%97%AD
http://www.sqlite.org/pragma.html#pragma_journal_size_limit
https://blog.xojo.com/2015/12/21/speed-up-sqlite-with-write-ahead-logging/
https://stackoverflow.com/questions/31971905/enable-shared-cache-mode-in-system-data-sqlite-net
http://frontier.snucse.org/sqlite_faster.html
http://blog.naver.com/goddes4/220326357700
http://www.w3ii.com/ko/sqlite/sqlite_detach_database.html
https://sqlite.org/limits.html
https://stackoverflow.com/questions/19479253/how-to-get-row-number-in-sqlite
https://stackoverflow.com/questions/1237068/pivot-in-sqlite
http://www.sqlite.org/limits.html
http://www.sqlite.org/pragma.html#pragma_schema_version

'DB' 카테고리의 다른 글

(Oracle) UNPIVOT  (1) 2018.02.20
(SQLite) insert 쿼리 수행 속도 높이기  (3) 2018.01.20
SQLite 참고 링크 모음  (1) 2017.11.23
SQLite 공유 캐시 모드  (0) 2017.08.24
[Oracle] 시간 타입 컬럼 시분초 형태로 결과보기 (nls_date)  (0) 2017.06.28
ORACLE vs DB2  (0) 2017.05.30
  1. Favicon of http://kjun.kr kjun.kr 2017.11.24 13:48 신고

    https://ourcodeworld.com/articles/read/366/how-to-generate-a-pdf-from-html-using-wkhtmltopdf-with-c-in-winforms

http://www.sqlite.org/sharedcache.html

번역

 

 1. SQLite 공유 캐시 모드

 버전 3.3.0 (2006-01-11)부터 SQLite는 임베디드 서버에서 사용하기위한 특별한 "공유 캐시"모드 (기본적으로 비활성화 됨)를 포함합니다.  공유 캐시 모드가 사용 가능하고 스레드가 동일한 데이터베이스에 대한 다중 연결을 설정하면 연결은 단일 데이터 및 스키마 캐시를 공유합니다.  이렇게하면 시스템에 필요한 메모리 및 IO의 양을 크게 줄일 수 있습니다.

 버전 3.5.0 (2007-09-04)에서는 공유 캐시 모드가 수정되어 단일 스레드 내에서가 아닌 전체 프로세스에서 동일한 캐시를 공유 할 수 있습니다.  이 변경 이전에는 스레드간에 데이터베이스 연결을 전달하는 데 제한이있었습니다.  이러한 제한 사항은 3.5.0 업데이트에서 제외되었습니다.  이 문서는 3.5.0 버전의 공유 캐시 모드에 대해 설명합니다.

 공유 캐시 모드는 경우에 따라 잠금 모델의 의미를 변경합니다.  자세한 내용은이 문서에서 설명합니다.  일반적인 SQLite 잠금 모델에 대한 기본적인 이해가 있습니다 (자세한 내용은 SQLite 버전 3의 파일 잠금 및 동시성 참조).

 2. 공유 캐시 잠금 모델

 외부 적으로는 다른 프로세스 또는 스레드의 관점에서 볼 때 공유 캐시를 사용하는 둘 이상의 데이터베이스 연결 이 단일 연결로 나타납니다.  여러 공유 캐시 또는 일반 데이터베이스 사용자간에 중재하는 데 사용되는 잠금 프로토콜은 다른 곳에서 설명합니다.

 

 그림 1

 그림 1은 세 개의 데이터베이스 연결이 설정된 런타임 구성 예제를 보여줍니다.  연결 1은 일반적인 SQLite 데이터베이스 연결입니다.  연결 2와 3은 캐시를 공유합니다. 일반 잠금 프로토콜은 연결 1과 공유 캐시 간의 데이터베이스 액세스를 직렬화하는 데 사용됩니다.  연결 2와 3에 의한 공유 캐시에 대한 직렬화 (또는 아래의 "읽기 - 미 확정적 격리 모드"참조)에 사용되는 내부 프로토콜은이 절의 나머지 부분에서 설명합니다.

 공유 캐시 잠금 모델, 트랜잭션 수준 잠금, 테이블 수준 잠금 및 스키마 수준 잠금의 세 가지 수준이 있습니다.  그것들은 다음의 세 가지 하위 섹션에서 설명합니다.

 2.1.  트랜잭션 수준 잠금

 SQLite 연결은 두 종류의 트랜잭션, 읽기 및 쓰기 트랜잭션을 열 수 있습니다.  이것은 명시 적으로 수행되지 않고 트랜잭션은 암시 적으로 데이터베이스 트랜잭션 테이블에 쓰기 전까지는 암시 적으로 읽기 트랜잭션입니다.이 시점에서 트랜잭션은 쓰기 트랜잭션이됩니다.

 최대 하나의 공유 캐시에 대한 연결은 한 번에 쓰기 트랜잭션을 열 수 있습니다.  이것은 임의의 수의 읽기 트랜잭션과 공존 할 수 있습니다.

 2.2.  테이블 수준 잠금

 둘 이상의 연결에서 공유 캐시를 사용하는 경우 잠금은 테이블 당 동시 액세스 시도를 직렬화하는 데 사용됩니다.  테이블은 두 가지 유형의 잠금 "읽기 잠금"과 "쓰기 잠금"을 지원합니다.  잠금은 연결에 부여됩니다. 각 데이터베이스 연결에는 읽기 잠금, 쓰기 잠금 또는 각 데이터베이스 테이블에 대한 잠금이 없습니다.

 한 번에 하나의 테이블에 여러 개의 활성 읽기 잠금 또는 단일 활성 쓰기 잠금이있을 수 있습니다.  데이터를 테이블로 읽으려면 먼저 연결에서 읽기 잠금을 얻어야합니다.  테이블에 쓰려면 연결에서 해당 테이블에 대한 쓰기 잠금을 얻어야합니다.  필요한 테이블 잠금을 얻을 수 없으면 쿼리가 실패하고 SQLITE_LOCKED가 호출자에게 반환됩니다.

 일단 연결이 테이블 잠금을 얻으면 현재 트랜잭션 (읽기 또는 쓰기)이 끝날 때까지 해제되지 않습니다.

 2.2.1.  읽기 커밋되지 않은 격리 모드

 위에서 설명한 동작은 read_uncommitted pragma를 사용하여 격리 수준을 serialize (기본값)에서 read-uncommitted로 변경하여 약간 수정할 수 있습니다.

 읽기 - 확약되지 않은 모드의 데이터베이스 연결은 위에서 설명한대로 데이터베이스 테이블에서 읽기 전에 읽기 잠금을 얻으려고 시도하지 않습니다.  이로 인해 다른 데이터베이스 연결이 읽는 동안 테이블을 수정하더라도 일관성없는 쿼리 결과가 발생할 수 있지만 읽기 연결되지 않은 모드에서 연결에 의해 열린 읽기 트랜잭션이 다른 연결에 의해 차단되거나 차단되지 않을 수도 있습니다.

 읽기 - 커밋되지 않은 모드는 데이터베이스 테이블에 쓰는 데 필요한 잠금에 영향을주지 않습니다 (즉, 읽기 - 커밋되지 않은 연결은 쓰기 잠금을 가져야하므로 데이터베이스 쓰기는 여전히 차단되거나 차단 될 수 있음).  또한 read-uncommitted 모드는 아래 열거 된 규칙 ( "스키마 (sqlite_master) 레벨 잠금"절 참조)에서 요구하는 sqlite_master 잠금에 영향을 미치지 않습니다.

   / * read-uncommitted 플래그의 값을 설정합니다 :
   **
   ** True -> 읽기 - 커밋되지 않은 모드로 연결을 설정합니다.
   ** 거짓 -> 연결을 직렬화 (기본값) 모드로 설정하십시오.
   * /
   PRAGMA read_uncommitted = <boolean>;

   / * read-uncommitted 플래그의 현재 값 검색 * /
   PRAGMA read_uncommitted;


 2.3.  스키마 (sqlite_master) 수준 잠금

 sqlite_master 테이블은 다른 모든 데이터베이스 테이블과 동일한 방식으로 공유 캐시 읽기 및 쓰기 잠금을 지원합니다 (위의 설명 참조).  다음 특별 규정이 적용됩니다.
•  연결은 데이터베이스 테이블에 액세스하거나 다른 읽기 또는 쓰기 잠금을 얻기 전에 sqlite_master 에서 읽기 잠금을 가져와야 합니다.
•  데이터베이스 스키마 (예 : CREATE 또는 DROP TABLE 문)를 수정하는 명령문을 실행하기 전에 sqlite_master 에서 쓰기 잠금을 가져와야 합니다.
•  다른 연결에서 연결된 데이터베이스 (기본 데이터베이스 "main"포함)의 sqlite_master 테이블에 쓰기 잠금이있는 경우 연결에서 SQL 문을 컴파일하지 못할 수 있습니다.

 3. 스레드 관련 문제

 SQLite 버전 3.3.0에서 3.4.2까지 공유 캐시 모드를 사용하는 경우 sqlite3_open () 을 호출 한 스레드에서만 데이터베이스 연결을 사용할 수 있습니다.  그리고 연결은 동일한 스레드의 다른 연결과 캐시를 공유 할 수있었습니다.  이러한 제한 사항은 SQLite 버전 3.5.0 (2007-09-04)부터 삭제되었습니다.

 4. 공유 캐시 및 가상 테이블

 이전 버전의 SQLite에서는 공유 캐시 모드를 가상 테이블과 함께 사용할 수 없었습니다.  이 제한 사항은 SQLite 버전 3.6.17 (2009-08-10)에서 제거되었습니다.

 5. 공유 캐시 모드 활성화

 공유 캐시 모드는 프로세스별로 사용할 수 있습니다.  C 인터페이스를 사용하여 다음 API를 사용하여 공유 캐시 모드를 전역 적으로 활성화 또는 비활성화 할 수 있습니다.

 int sqlite3_enable_shared_cache (int);


 sqlite3_enable_shared_cache ()를 호출 할 때마다 sqlite3_open () , sqlite3_open16 () 또는 sqlite3_open_v2 ()를 사용하여 생성 된 후속 데이터베이스 연결에 영향을줍니다.  이미 존재하는 데이터베이스 연결은 영향을받지 않습니다.  sqlite3_enable_shared_cache ()를 호출 할 때마다 동일한 프로세스 내의 모든 이전 호출이 무시됩니다.

 sqlite3_open_v2 ()를 사용하여 생성 된 개별 데이터베이스 연결은 세 번째 매개 변수 인 SQLITE_OPEN_SHAREDCACHE 또는 SQLITE_OPEN_PRIVATECACHE 플래그를 사용하여 공유 캐시 모드에 참여하거나 참여하지 않도록 선택할 수 있습니다.  이러한 플래그 중 하나를 사용하면 sqlite3_enable_shared_cache ()가 설정 한 전역 공유 캐시 모드 설정이 무시됩니다.  플래그 중 하나만 사용해야합니다.  sqlite3_open_v2 () 의 세 번째 인수에서 SQLITE_OPEN_SHAREDCACHE 및 SQLITE_OPEN_PRIVATECACHE 플래그가 모두 사용되는 경우 동작은 정의되지 않습니다.

 URI 파일 이름 이 사용되면 "cache"쿼리 매개 변수를 사용하여 데이터베이스에서 공유 캐시를 사용할지 여부를 지정할 수 있습니다.  공유 캐시를 사용하려면 "cache = shared"를 사용하고 공유 캐시를 사용하지 않으려면 "cache = private"을 사용하십시오.  URI 쿼리 매개 변수를 사용하여 데이터베이스 연결의 캐시 공유 동작을 지정하는 기능을 사용하면 ATTACH 문에서 캐시 공유를 제어 할 수 있습니다.  예 :

 ATTACH의 파일 : aux.db? cache = shared 'aux;


  6. 공유 캐시 및 메모리 데이터베이스

 SQLite 버전 3.7.13 (2012-06-06)부터 데이터베이스가 URI 파일 이름을 사용하여 생성 된 경우 메모리 내 데이터베이스에서 공유 캐시를 사용할 수 있습니다.  이전 버전과의 호환성을 위해 공유되지 않은 이름 ": memory :"가 데이터베이스를 여는 데 사용되는 경우 공유 메모리는 메모리 내 데이터베이스에서 항상 비활성화됩니다.  버전 3.7.13 이전에는 사용 된 데이터베이스 이름, 현재 시스템 공유 캐시 설정 또는 쿼리 매개 변수 또는 플래그와 상관없이 메모리 내 데이터베이스에 대한 공유 캐시가 항상 비활성화되었습니다.

 메모리 내 데이터베이스에 공유 캐시를 사용하면 같은 프로세스의 두 개 이상의 데이터베이스 연결이 동일한 메모리 내 데이터베이스에 액세스 할 수 있습니다.  공유 캐시에있는 메모리 내 데이터베이스는 자동으로 삭제되고 해당 데이터베이스에 대한 마지막 연결이 닫히면 메모리가 회수됩니다.

'DB' 카테고리의 다른 글

(SQLite) insert 쿼리 수행 속도 높이기  (3) 2018.01.20
SQLite 참고 링크 모음  (1) 2017.11.23
SQLite 공유 캐시 모드  (0) 2017.08.24
[Oracle] 시간 타입 컬럼 시분초 형태로 결과보기 (nls_date)  (0) 2017.06.28
ORACLE vs DB2  (0) 2017.05.30
(SQLite) SQLite with GPU  (0) 2017.04.30

sql developer 로 오라클 날짜 관련 함수를 select 하게되면

25/06/2017

위와 같은 형태로 날짜 까지만 보여지게 됩니다.

그런데 시분초 까지 보고 싶다면

alter session set nls_date_format='YYYY-MM-DD HH24:MI:SS';

위 명령어를 수행 후에 select 하게 되면 시분초로 날짜 컬럼을 select 해서 데이터를 확인할 수 있습니다.

단. 각 창별(세션별)로 실행을 해주어야합니다.

(해당 세션에서만 유효)

'DB' 카테고리의 다른 글

SQLite 참고 링크 모음  (1) 2017.11.23
SQLite 공유 캐시 모드  (0) 2017.08.24
[Oracle] 시간 타입 컬럼 시분초 형태로 결과보기 (nls_date)  (0) 2017.06.28
ORACLE vs DB2  (0) 2017.05.30
(SQLite) SQLite with GPU  (0) 2017.04.30
(SQLITE) 참고 (링크)  (0) 2017.04.17

IBM DB2 to Oracle Migration

SQLines provides open-source tools to help you transfer data, convert database schema (DDL), views, stored procedures, functions, triggers, queries and SQL scripts from IBM DB2 to Oracle.

We also help convert embedded SQL statements in C/C++ (ODBC, ESQL/C), C#, Java, PowerBuilder, VB/VB.NET, ASP/ASP.NET, PerlPHP, Python, Linux shell and other applications. SQLines can also assist you to convert COBOL stored procedures and programs to Oracle PL/SQL or Java.

  • IBM DB2 for LUW, z/OS and OS/400 11.x, 10.x, 9.x, 8.x and 7.x
  • Oracle 12c and 11g

DB2 to Oracle Migration Tools

SQLines SQL Converter Tool

SQLines SQL Converter tool allows you to convert database schema (DDL), queries and DML statements, views, stored procedures, functions and triggers from IBM DB2 to Oracle.

SQLines tool converts SQL scripts and standalone SQL statements. To migrate data and database schema from an IBM DB2 database use SQLines Data tool.

Try SQLines Online or download a free Desktop Version.

DB2 to Oracle Migration Reference

Language Elements

Converting SQL language elements from DB2 to Oracle:

DB2Oracle
1string1 CONCAT string 2 CONCAT …String concatenation operatorstring1 || string 2 || …
2NEXTVAL | NEXT VALUE FOR seq_nameNext value for sequenceseq_name.NEXTVAL
3RESULT_SET_LOCATORProcessing result sets in procedureSYS_REFCURSOR

Datetime interval expressions:

DB2Oracle
1num DAY | DAYSInterval in daysINTERVAL 'num' DAY
var DAY | DAYSNUMTODSINTERVAL(var, 'DAY')
2num MINUTE | MINUTESInterval in minutesINTERVAL 'num' MINUTE
var MINUTE | MINUTESNUMTODSINTERVAL(var, 'MINUTE')

Data Types

Data type mapping between DB2 and Oracle:

DB2Oracle
1BIGINT64-bit integerNUMBER(19)
2BLOB(n)Binary large object, 1 ⇐ n ⇐ 2GBLOB 
3CHAR(n), CHARACTER(n)Fixed-length string, 1 ⇐ n ⇐ 254CHAR(n), CHARACTER(n)
4CHAR(n) FOR BIT DATAFixed-length byte string, 1 ⇐ n ⇐ 254RAW(n)
5CHARACTER VARYING(n)Variable-length string, 1 ⇐ n ⇐ 32672 VARCHAR2(n)
6CLOB(n)Character large object, 1 ⇐ n ⇐ 2GCLOB 
7DATEDate (year, month and day)DATEIncludes time part 
8DBCLOB(n)UTF-16 character large object, 1 ⇐ n ⇐ 1GNCLOB
9DECIMAL(p,s), DEC(p,s)Fixed-point numberNUMBER(p,s)
10DECFLOAT(16 | 34)IEEE floating-point numberNUMBER
11DOUBLE [PRECISION]Double-precision floating-point numberBINARY_DOUBLE
12FLOAT(p)Double-precision floating-point numberBINARY_DOUBLE
13GRAPHIC(n)Fixed-length UTF-16 string, 1 ⇐ n ⇐ 127NCHAR(n)
14INTEGER, INT32-bit integerNUMBER(10)
15NCHAR(n)Fixed-length UTF-16 string, 1 ⇐ n ⇐ 127NCHAR(n)
16NCHAR VARYING(n)Varying-length UTF-16 string, 1 ⇐ n ⇐ 16336 NVARCHAR2(n)
17NCLOB(n)UTF-16 character large object, 1 ⇐ n ⇐ 1GNCLOB 
18NUMERIC(p,s), NUM(p,s)Fixed-point numberNUMBER(p,s)
19NVARCHAR(n)Varying-length UTF-16 string, 1 ⇐ n ⇐ 16336 NVARCHAR2(n)
20REALSingle-precision floating-point numberBINARY_FLOAT
21SMALLINT16-bit integerNUMBER(5)
22TIMETime (hour, minute, and second)TIMESTAMP(0) 
23TIMESTAMP(p)Date and time with fractionTIMESTAMP(p)
24VARCHAR(n)Variable-length string, 1 ⇐ n ⇐ 32672 VARCHAR2(n)
25VARCHAR(n) FOR BIT DATAVariable-length byte string, 1 ⇐ n ⇐ 32672 RAW(n)
26VARGRAPHIC(n)Variable-length UTF-16 string, 1 ⇐ n ⇐ 16336 NVARCHAR2(n)
27XMLXML dataXMLTYPE

Built-in SQL Functions

Converting functions:

DB2Oracle
1ABS(num), ABSVAL(num)Get the absolute valueABS(num)
2ACOS(num)Get the arc cosineACOS(num)
3ADD_MONTHS(date, num)Add num months to datetimeADD_MONTHS(date, num)
4ASCII(str)Get ASCII code of left-most charASCII(str)
5ASIN(num)Get the arc sineASIN(num)
6ATAN(num)Get the arc tangentATAN(num)
7ATAN2(x, y)Get the arc tangent of x and yATAN2(y, x
8ATANH(exp)Get hyperbolic arctangent
9BIGINT(exp)Convert to 64-bit integerTRUNC(TO_NUMBER(exp))
10BITAND(exp1, exp2)Perform bitwise ANDBITAND(exp1, exp2)
11BITANDNOT(exp)Perform bitwise AND NOT
12BITOR(exp)Performs bitwise OR
13BITXOR(exp)Performs bitwise exclusive OR
14BITNOT(exp)Performs bitwise NOT
13BLOB(exp [,size])Convert to BLOBTO_BLOB(exp)
14CEILING(num)Get the smallest following integerCEIL(num)
CEIL(num)
15CHAR(stringnum)Truncate or pad string to numRPAD(SUBSTR(string, 1, num), num)
CHAR(date, USA)Convert date to stringTO_CHAR(date, 'MM/DD/YYYY')
16CHAR_LENGTH(string)Get length of string in charactersLENGTH(string)
CHARACTER_LENGTH(string)
17CHAR_LENGTH(string, units)Get length of string in unitsLENGTH2(string), LENGTH4(string), 
LENGTHB(string)
CHARACTER_LENGTH(string, units)
18CLOB(exp [,size])Convert to CLOBTO_CLOB(exp)
19CHR(num)Get character from ASCII codeCHR(num)
20COALESCE(exp1exp2, …)Return first non-NULL expressionCOALESCE(exp1exp2, …)
21CONCAT(str1, str2)Concatenate stringsCONCAT(str1, str2)
22COS(num)Get the cosineCOS(num)
23COT(num)Get the cotangent1 / TAN(num)
24CURRENT DATEGet the current dateTRUNC(SYSDATE)
CURRENT_DATE
25CURRENT SCHEMAGet the current schemaCURRENT_SCHEMA
CURRENT_SCHEMA
26CURRENT SERVERGet the current database nameSYS_CONTEXT('USERENV', 'DB_NAME')
CURRENT_SERVER
27CURRENT SQLIDGet current schemaCURRENT_SCHEMA
CURRENT_SQLID
28CURRENT TIMESTAMPGet the current date and timeCURRENT_TIMESTAMP
CURRENT_TIMESTAMP
29CURRENT TIMEGet the current timeSYSTIMESTAMP
CURRENT_TIME
30CURRENT USERGet the authenticated user nameUSER
CURRENT_USER
31CURSOR_ROWCOUNT(cur)Get the number of fetched rowscur%ROWCOUNT
32DATE(timestamp)Convert to DATETRUNC(timestamp)
33DAY(datetime)Extract day from datetimeEXTRACT(DAY FROM datetime)
34DAYNAME(datetime)Get the name of the weekdayTO_CHAR(datetime, 'Day')
35DAYOFWEEK(datetime)Get the weekday indexTO_NUMBER(TO_CHAR(datetime
'D'))
36DAYOFWEEK_ISO(exp)Get the day of the week as intTO_NUMBER(TO_CHAR(exp, 'D')) 
37DAYOFYEAR(datetime)Get the day of the yearTO_NUMBER(TO_CHAR(datetime
'DDD'))
38DAYS(exp)Get the number of days(exp - DATE '0001-01-02')
39DBCLOB(exp [,size])Convert to DBCLOBTO_CLOB(exp)
40DECFLOAT(exp [,size])Convert to DECFLOATTO_NUMBER(exp)
41DECFLOAT_FORMAT(exp [,fmt])Convert to DECFLOAT(34)TO_NUMBER(exp [,fmt])
42DECIMALConvert to DECIMALTO_NUMBER
43DEC
44DECODE(expwhenthen, …)Evaluate conditionDECODE(expwhenthen, …)
45DEGREES(num)Convert radians to degrees(num) * 180/3.1415926535
46DEREF(exp)Get instance of the target typeDEREF(exp)
47DIGITS(exp)Extract digits onlyTRANSLATE(exp, '0-+.,', '0')
48DOUBLE(exp)Convert to DOUBLETO_NUMBER(exp)
49DOUBLE_PRECISION(exp)
50EMPTY_BLOB()Get empty BLOBEMPTY_BLOB()
51EMPTY_CLOB()Get empty CBLOBEMPTY_CLOB()
52EMPTY_DBCLOB()Get empty DBCLOBEMPTY_CLOB()
53EMPTY_NCLOB()
54EXP(n)Raise e to the nth powerEXP(n)
55EXTRACT(unit FROM datetime)Extract unit from datetimeEXTRACT(unit FROM datetime)
56FLOAT(n)Convert to DOUBLETO_NUMBER(n)
57FLOOR(num)Get the largest preceding intFLOOR(num)
58GREATEST(exp, exp2, …)Get the maximum value in a setGREATEST(exp, exp2, …)
59HEX(exp)Convert to hex string
60HEXTORAW(exp)Convert hex string to binaryHEXTORAW(exp)
61HOUR(exp)Extract hour from datetimeEXTRACT(HOUR FROM exp)
62INITCAP(string)Capitalize wordsINITCAP(string)
63INSERT(expstartlenins)Replace substringUser-defined function
64INSTR(str, substr, pos, num)Get position of substringINSTR(str, substr, pos, num)
65INSTRB(expsearchstartnum)Get position of substring in bytesINSTRB(expsearchstartnum)
66INTEGER(exp)Convert to integerTRUNC(TO_NUMBER(exp))
67INT(exp)
68JULIAN_DAY(exp)Get Julian dayTO_NUMBER(TO_CHAR(exp, 'J'))
69LAST_DAY(date)Get last day of the monthLAST_DAY(date)
70LCASE(string)Lowercase stringLOWER(string)
71LEAST(exp, exp2, …)Get the minimum value in a setLEAST(exp, exp2, …)
72LEFT(string, n)Get n leftmost charactersSUBSTR(string, 1, n)
73LENGTH(string)Get length of string in charsLENGTH(string)
74LN(exp)Get natural logarithmLN(exp)
75LOCATE(substring, str, start)Get position of substringINSTR(str, substring, start
76LOCATE_IN_STRING(expsearchstartnum)Get position of substringINSTR(expsearchstartnum)
77LOG10(exp)Get logarithm, base 10LOG(10, exp)
78LONG_VARCHAR(exp)Convert to LONG VARCHARTO_CLOB(exp)
79LONG_VARGRAPHIC(exp)Convert to LONG VARGRAPHICTO_CLOB(exp)
80LOWER(string)Lowercase stringLOWER(string)
81LPAD(string, len)Pad the left-side of stringLPAD(string, len)
LPAD(string, len, pad)LPAD(string, len, pad)
82LTRIM(string)Remove leading spacesLTRIM(string)
LTRIM(string, set)Remove leading charsLTRIM(string, set)
83MAX(expexp2, …)Get the maximum value in a setGREATEST(expexp2, …)
84MICROSECOND(exp)Get the microsecondTO_NUMBER(TO_CHAR(exp, 'FF6'))
85MIDNIGHT_SECONDS(exp)Get seconds since midnightTO_NUMBER(TO_CHAR(exp, 'SSSSS'))
86MIN(expexp2, …)Get the minimum value in a setLEAST(expexp2, …)
87MINUTE(datetime)Extract minute from datetimeEXTRACT(MINUTE FROM datetime)
88MOD(dividend, divisor)Get the remainderMOD(dividend, divisor)
89MONTH(date)Extract month from dateEXTRACT(MONTH FROM date)
90MONTHNAME(date)Get the name of the monthTO_CHAR(date, 'Month')
91MONTHS_BETWEEN(date1, date2)Get number of months between 
date1 and date2
MONTHS_BETWEEN(date1, date2)
92MULTIPLY_ALT(exp, exp2)Get product of the 2 arguments(exp * exp2)
93NCHAR(exp)Convert to NCHARTO_NCHAR(exp)
94NCLOB(exp [,size])Convert to NCLOBTO_NCLOB(exp)
95NVARCHARConvert to NVARCHARTO_NCHAR
96NEXT_DAY(exp, weekday)Get next weekdayNEXT_DAY(exp, exp2)
97NULLIF(exp1, exp2)Return NULL if exp1 = exp2NULLIF(exp1, exp2)
98NVL(exp1, exp2)Replace NULL with the specified valueNVL(exp1, exp2)
NVL(exp1, exp2, …)Return first non-NULL expressionCOALESCE(exp1, exp2, …)
99NVL2(exp1, exp2, exp3)Return exp2 if exp1 is not NULL, otherwise exp3NVL2(exp1, exp2, exp3)
100OCTET_LENGTH(exp)Get length in bytesLENGTHB(exp)
101OVERLAY(exp, ins, start, len, unit)Replace substringUser-defined function
102POSITION(substring, exp, unit)Get position of substringINSTR(exp, substring
103POSSTR(exp, substring)Get position of substringINSTR(exp, substring)
104POWER(value, n)Raise value to the nth powerPOWER(value, n)
105QUARTER(date)Get the quarter of the yearTO_NUMBER(TO_CHAR(date, 'Q'))
106RADIANS(numeric)Convert degrees to radians(numeric) * 3.1415926535/180
107RAISE_ERROR(sqlstate, exp)Raise an errorRAISE_APPLICATION_ERROR 
108RAND([integer])Get random float value in (0, 1)DBMS_RANDOM.VALUE
109REAL(exp)Convert to REALTO_NUMBER(exp)
110REPEAT(string, n)Repeat string n timesRPAD(string, LENGTH(string) * nstring)
111REPLACE(str, search)Remove search-stringREPLACE(str, search)
REPLACE(str, search, replace)Replace search-stringREPLACE(str, search, replace)
112RIGHT(string, n)Get n rightmost charactersSUBSTR(string, -n
113ROUND(num, integer)Get rounded valueROUND(num, integer)
114ROUND_TIMESTAMP(exp [,format])Get rounded datetimeROUND(exp [,format])
115RPAD(string, len)Pad the right-side of stringRPAD(string, len)
RPAD(string, len, pad)RPAD(string, len, pad)
116RTRIM(string)Remove trailing spacesRTRIM(string)
RTRIM(string, set)Remove trailing charsRTRIM(string, set)
117SECOND(datetime[, integer])Extract second from datetimeTRUNC(EXTRACT(SECOND FROM 
datetime)[, integer])
118SIGN(exp)Get sign of expSIGN(exp)
119SIN(num)Get sineSIN(num)
120SINH(num)Get hyperbolic sineSINH(num)
121SMALLINT(exp)Convert to SMALLINTTRUNC(TO_NUMBER(exp))
122SOUNDEX(string)Get 4-character sound codeSOUNDEX(string)
123SPACE(integer)Get string of spacesRPAD(' ', integer)
124SQRT(num)Get square rootSQRT(num)
125STRIP(exp [,type, character])Remove charactersTRIM([type character FROM] exp)
126SUBSTR(string, pos, len)Get a substring of stringSUBSTR(string, pos, len)
127SUBSTR2(exp, start [,len])Get a substring of expSUBSTR2(exp, start [,len])
128SUBSTRB(exp, start [,len])Get a substring of expSUBSTRB(exp, start [,len])
129SUBSTRING(exp, start [,len], unit)Get a substring of expSUBSTR2(exp, start [,len])
SUBSTR4(exp, start [,len])
SUBSTRB(exp, start [,len])
130TAN(num)Get tangentTAN(num)
131TANH(num)Get hyperbolic tangentTANH(num)
132TIME(exp)Get timeTO_TIMESTAMP(exp)
133TIMESTAMP(exp)Convert to TIMESTAMPTO_TIMESTAMP(exp)
134TIMESTAMP_FORMAT(exp)Convert to TIMESTAMPTO_TIMESTAMP(exp)
135TIMESTAMP_ISO(exp)Convert to TIMESTAMPTO_TIMESTAMP(exp)
136TIMESTAMPDIFF(exp, exp2)Difference between two timestampsUser-defined function
137TO_CHAR(exp [,format])Convert to stringTO_CHAR(exp [,format])
138TO_CLOB(exp [,size])Convert to CLOBTO_CLOB(exp)
139TO_DATE(exp)Convert to TIMESTAMPTO_DATE(exp)
140TO_NCHAR(exp)Convert to NCHARTO_NCHAR(exp)
141TO_NCLOB(exp [,size])Convert to NCLOBTO_NCLOB(exp)
142TO_NUMBER(exp [,fmt])Convert to DECFLOAT(34)TO_NUMBER(exp [,fmt])
143TO_SINGLE_BYTE(exp)Convert to single-byte characterTO_SINGLE_BYTE(exp)
144TO_TIMESTAMP(exp)Convert to TIMESTAMPTO_TIMESTAMP(exp)
145TRANSLATE(exp, from, to)Replace charactersTRANSLATE(exp, from, to)
146TRIM([type trim FROM] string)Remove charactersTRIM([type trim FROM] string)
147TRUNC_TIMESTAMP(exp [,format]Truncate TIMESTAMPTRUNC(exp [,format]
148TRUNC(exp, exp2)Truncate expTRUNC(exp, exp2)
149TRUNCATE(exp, exp2)TRUNC(exp, exp2)
150UCASE(string)Uppercase stringUPPER(string)
151UPPER(string)Uppercase stringUPPER(string)
152VALUE(expexp2, …)Return first non-NULL expressionCOALESCE(expexp2, …)
153VARCHAR(exp [,exp2])Convert to VARCHARTO_CHAR(exp [,exp2])
154VARCHAR_BIT_FORMAT(exp [,fmt])Convert hex string to binaryHEXTORAW(exp)
155VARCHAR_FORMAT(exp [,fmt])Convert to stringTO_CHAR(exp [,fmt])
156VARCHAR_FORMAT_BIT(exp [,fmt])Convert binary to hex stringRAWTOHEX(exp)
157VARGRAPHIC(exp [,exp2])Convert to NCHARTO_NCHAR(exp [,exp2])
158WEEK(exp)Get week of the yearTO_NUMBER(TO_CHAR(exp, 'WW')) 
159WEEK_ISO(exp)Get week of the yearTO_NUMBER(TO_CHAR(exp, 'IW'))
160XMLATTRIBUTES(exp, …)Construct XML attributesXMLATTRIBUTES(exp, …)
161XMLCOMMENT(exp)Generate an XML commentXMLCOMMENT(exp)
162XMLCONCAT(exp, exp2, …)Concatenate XML expressionsXMLCONCAT(exp, exp2, …)
163XMLDOCUMENT(exp)Get XML document
164XMLELEMENT(NAME exp)Get an XQuery element nodeXMLELEMENT(NAME exp)
165XMLFOREST(exp, exp2, …)Get a forest of XML expressionsXMLFOREST(exp, exp2, …)
166XMLNAMESPACES(uri, …)Get namespace
167XMLPARSE(DOCUMENT exp)Parse XML documentXMLPARSE(DOCUMENT exp)
168XMLPI(NAME identifier)Get XML processing instructionXMLPI(NAME identifier)
169XMLQUERY(exp, …)Convert XML data in SQLXMLQUERY(exp, …)
170XMLROW(exp, …)Get XML document node
171XMLSERIALIZE(CONTENT exp 
AS datatype)
Get a serialized XML valueXMLSERIALIZE(CONTENT exp 
AS datatype)
172XMLTEXT(exp, …)Get XML text
173XMLVALIDATE(exp, …)Get XML with information
174XMLXMLXSROBJECTID(exp)Get XSR object
175XSLTRANSFORM(doc USING xslt)Transform XML documentXMLTRANSFORM(docxslt)
176YEAR(date)Extract year from dateEXTRACT(YEAR FROM date)

SELECT Statement

Converting SQL SELECT statement:

DB2Oracle
1SYSIBM.SYSDUMMY1 tableA single row, single column dummy tableDUAL table
2WHERE (c1, c2, …) = (v1, v2, …)Specific AND syntaxc1 = v1 AND c2 = v2 AND …
3EXCEPTSet operatorMINUS
4FETCH FIRST n ROWS ONLYReturn n rows after sorting ROWNUM and subquery
FETCH FIRST ROW ONLYReturn 1 row only after sorting
5WITH UR | CS | RS | RRIsolation level for SELECTWITH UR and CS removed

CREATE TABLE Statement

Converting CREATE TABLE statement from DB2 to Oracle:

DB2Oracle
1GENERATED ALWAYS | BY DEFAULT 
AS IDENTITY
Identity columnEmulated using sequence and trigger
2FOR COLUMN system_nameSystem column name (OS/400)Removed
3FOR BIT DATABinary data encodingRemoved
FOR SBCS | MIXED DATAColumn data encoding (z/OS)Removed
4CCSID ASCII | UNICODE | EBCDICCharacter setRemoved
CCSID numColumn character set (OS/400)Removed
5DEFAULT expColumn defaultDEFAULT must be specified right after 
data type, before NOT NULL etc. 
6IN tablespaceTablespace nameTABLESPACE tablespace
7DATA CAPTURE NONE | CHANGESChange data captureRemoved
8AUDIT NONE | CHANGES | ALLAudit type (z/OS)Removed
9WITH RESTRICT ON DROPDrop restrictionRemoved
10[NOT] VOLATILETable size variation (z/OS)Removed
11APPEND NO | YESAppend rows on insert or load (z/OS)Removed
12PARTITION BY SIZE EVERY n GSize-based partitioning (z/OS)Removed
13PARTITION BY RANGERange-based partitioningPARTITION BY RANGE (see below)

Implicit DEFAULT values in DB2:

DB2Oracle
1column CHAR(n) WITH DEFAULTcolumn CHAR(n) DEFAULT ''
2column VARCHAR(n) WITH DEFAULTcolumn VARCHAR2(n) DEFAULT ''
3column INTEGER WITH DEFAULTcolumn NUMBER(10) DEFAULT 0
4column DECIMAL(p, s) WITH DEFAULTcolumn NUMBER(p, s) DEFAULT 0
5column NUMERIC(p, s) WITH DEFAULTcolumn NUMBER(p, s) DEFAULT 0
6column DATE WITH DEFAULTcolumn DATE DEFAULT SYSDATE
7column TIMESTAMP WITH DEFAULTcolumn TIMESTAMP DEFAULT SYSTIMESTAMP
8column CLOB WITH DEFAULTcolumn CLOB DEFAULT EMPTY_CLOB()

Converting GLOBAL TEMPORARY TABLE clauses from DB2 to Oracle:

DB2Oracle
1DECLARE GLOBAL TEMPORARY TABLE nameCREATE GLOBAL TEMPORARY TABLE name
2AS (SELECT …)Definition and data from SELECTAS (SELECT …)
3ON COMMIT DELETE | PRESERVE ROWSON COMMIT DELETE | PRESERVE ROWS
4ON ROLLBACK DELETE ROWSDefault behavior, clause removed
ON ROLLBACK PRESERVE ROWSNot supported, commented 
5LOGGED | NOT LOGGEDRemoved
6WITH REPLACETRUNCATE TABLE is used
7WITH NO DATAData not copied at creation timeWHERE 1 = 0 condition added
DEFINITION ONLY
8Options ON COMMIT etc. specified after AS (SELECT …)Options specified before AS (SELECT …) 

Converting partitioning definition from DB2 to Oracle:

DB2Oracle
1PARTITION BY [RANGE] (col1, …)Range-based partitioningPARTITION BY RANGE (col1, …)
2(PARTITION num ENDING AT 
(limit | MAXVALUE), … )
Partition definition(PARTITION name VALUES LESS THAN 
(limit | MAXVALUE), … )

CREATE TABLESPACE Statement

Converting DB2 for z/OS CREATE TABLESPACE statement to Oracle:

DB2 for z/OSOracle
1CREATE TABLESPACE nameCREATE TABLESPACE name
2LOBLOB tablespaceRemoved
3IN databaseDatabase nameRemoved
4USING STOGROUP nameStorage group clauseDATAFILE 'tbsname.dbf'
5PCTFREE numFree space to leave in an index pageRemoved
6COMPRESS YES | NOCompression enabledRemoved
7FREEPAGE numLeave a free page per num pagesRemoved
8BUFFERPOOL nameBufferpool for tablespaceRemoved
9GBPCACHE CHANGED | ALL | SYSTEM | NONEPages written to global buffer poolRemoved
10CLOSE NO | YESData set eligible for closingRemoved
11COPY YES | NOCOPY utility is allowed for indexRemoved
12PIECESIZE sizeMaximum addressability of data setRemoved
13[NOT] LOGGEDLog changesNOLOGGING and LOGGING
14TRACKMOD YES | NOTrack changesRemoved
15SEGSIZE numNumber of pages in segmentRemoved
16LOCKSIZE ANY | TABLESPACE | TABLE | 
PAGE | ROW
Lock escalationRemoved
17LOCKMAX num | SYSTEMMaximum number of locksRemoved
18CCSID ASCII | UNICODE | EBCDICData encodingRemoved
19MAXROWS numMaximum number of rows per pageRemoved

USING STOGROUP clause (DB2 for z/OS):

DB2 z/OSOracle
1PRIQTY numRemoved
2SECQTY numRemoved
3ERASE NO | YESRemoved

CREATE INDEX Statement

Converting CREATE INDEX statement:

DB2Oracle
1PCTFREE numPCTFREE num

Additional DB2 z/OS clauses:

DB2 for z/OSSQL Server
1FREEPAGE numLeave a free page per num pagesRemoved
2BUFFERPOOL nameBufferpool for indexRemoved
3GBPCACHE CHANGED | ALL | NONEPages written to global buffer poolRemoved
4NOT CLUSTERNot the clustering indexRemoved
5CLOSE NO | YESData set eligible for closing or notRemoved
6COPY YES | NOCOPY utility is allowed for index or notRemoved
7PIECESIZE sizeMaximum addressability of data setRemoved
8[NOT] PADDEDPad variable-length columnsRemoved

USING STOGROUP clause (DB2 for z/OS only):

DB2 z/OSOracle
1PRIQTY numRemoved
2SECQTY numRemoved
3ERASE NO | YESRemoved

CREATE PROCEDURE Statement

Converting stored procedures from IBM DB2 to Oracle:

DB2Oracle
1CREATE OR REPLACE PROCEDURECREATE OR REPLACE PROCEDURE
2IN | OUT | INOUT param datatype(length)param IN | OUT | IN OUT datatype
3DETERMINISTICRemoved
4NOT DETERMINISTICRemoved
5LANGUAGE SQLRemoved
6CONTAINS SQLRemoved
7NO SQLRemoved
8READS SQL DATARemoved
9MODIFIES SQL DATARemoved
10[DYNAMIC] RESULT SETS numRemoved
11SPECIFIC nameRemoved
12CALLED ON NULL INPUTRemoved
13INHERIT SPECIAL REGISTERSRemoved
14[NO] EXTERNAL ACTIONRemoved
15COLLID namePackage collection (z/OS)Removed
16WLM ENVIRONMENT nameWorkload manager (z/OS)Removed
17RUN OPTIONS 'options'Run-time options (z/OS)Removed
18No AS keyword before outer BEGIN END blockIS keyword added
19Optional label before outer block label: BEGIN END labelLabel removed
20Declarations are inside BEGIN END blockDeclarations are before BEGIN END block
21Custom delimiter at the end/

For more information, see Conversion of Procedural SQL Statements.

CREATE FUNCTION Statement

Converting user-defined functions from DB2 to Oracle:

DB2Oracle
1CREATE OR REPLACE FUNCTION nameCREATE OR REPLACE FUNCTION name
2IN | OUT | INOUT param datatype(length)param IN | OUT | IN OUT datatype
3RETURNS datatype(length)RETURN datatype
4DETERMINISTICDETERMINISTIC
5NOT DETERMINISTICRemoved
6LANGUAGE SQLRemoved
7CONTAINS SQLRemoved
8NO SQLRemoved
9READS SQL DATARemoved
10MODIFIES SQL DATARemoved
11SPECIFIC nameRemoved
12CALLED ON NULL INPUTRemoved
13RETURNS NULL ON NULL INPUTRemoved
14INHERIT SPECIAL REGISTERSRemoved
15[NO] EXTERNAL ACTIONRemoved
16No AS keyword before outer BEGIN END blockAS keyword added
17BEGIN ATOMICBEGIN
18Declarations are inside BEGIN END blockDeclarations are before BEGIN END block
19No specific delimiter at the end/

For more information, see Conversion of Procedural SQL Statements.

CREATE TRIGGER Statement

Converting triggers from DB2 to Oracle:

DB2Oracle
1CREATE OR REPLACE TRIGGERCREATE OR REPLACE TRIGGER
2NO CASCADE BEFORETrigger actionBEFORE
3AFTERAFTER
4INSTEAD OFINSTEAD OF
5INSERTTrigger operationINSERT
6UPDATE [OF col, …]UPDATE [OF col, …]
7DELETEDELETE
8REFERENCING NEW [AS] new OLD [AS] oldREFERENCING NEW [AS] new OLD [AS] old
9FOR EACH ROWFOR EACH ROW
10FOR EACH STATEMENTFOR EACH STATEMENT
11MODE DB2SQLMode in DB2Removed
12WHEN (condition)Trigger conditionWHEN (condition)
13BEGIN ATOMICBEGIN
14NEW correlation name:NEW correlation name
15NEW. reference can be omitted in assignment:NEW. must be specified 
16OLD.columnOLD correlation name:OLD.column
17Optional BEGIN … ENDIf one statement in the bodyBEGIN … END required
18No specific delimiter at the end/

For more information, see Conversion of Procedural SQL Statements.

Procedural SQL Statements

Converting procedural SQL statements used in stored procedures, functions and triggers from IBM DB2 to Oracle:

DB2Oracle
1ALLOCATE CURSOR FOR RESULT SETProcess result set in SQL procedureRemoved, linked with SYS_REFCURSOR
2ASSOCIATE RESULT SET LOCATOR
3CALL proc(param, …)Call a procedureproc(param, …)
4CASE WHEN THEN ELSE END CASECASE statementCASE WHEN THEN ELSE END CASE
5DECLARE var datatype DEFAULT valueVariable declarationvar datatype DEFAULT value
DECLARE var, var2, … datatypevar datatypevar2 datatype; …
6DECLARE cur CURSOR FOR sqlCursor declarationCURSOR cur IS sql
DECLARE cur CURSOR WITH HOLD ...Remains open on commitWITH HOLD keyword removed
DECLARE cur CURSOR WITH RETURN FOR sqlResult setcur OUT SYS_REFCURSOR
7DECLARE CONTINUE HANDLER FOR NOT FOUNDNOT FOUND handlerEXCEPTION WHEN NO_DATA_FOUND, 
cur%NOTFOUND, SQL%ROWCOUNT
DECLARE type HANDLER FOR SQLEXCEPTIONSQL exception handlerEXCEPTION WHEN OTHERS
8DECLARE name CONDITION FOR SQLSTATE '23505'Unique key violationEXCEPTION WHEN DUP_VAL_ON_INDEX
DECLARE name CONDITION FOR SQLSTATE '02000'No data foundEXCEPTION WHEN NO_DATA_FOUND, 
cur%NOTFOUND, SQL%ROWCOUNT
9DECLARE SQLCODE INTEGER DEFAULT 0SQLCODE declarationDeclaration is not required, removed
DECLARE SQLSTATE CHAR(5)SQLSTATE declaration
10FETCH [FROM] cur INTO …Fetch a cursorFETCH cur INTO …
11FOR var AS SELECT … DO stmts 
END FOR;
For each row loopFOR var IN (SELECT …) LOOP stmts 
END LOOP;
FOR var AS cur CURSOR FOR 
SELECT … DO stmts END FOR;
12GET DIAGNOSTICS EXCEPTION 
var = MESSAGE_TEXT
Get the error messagevar := SQLERRM
GET DIAGNOSTICS var = ROW_COUNTGet affected rowsvar := SQL%ROWCOUNT
GET DIAGNOSTICS var = DB2_RETURN_STATUSProcedure call statusProcedure OUT parameter
13IF THEN ELSEIF ELSE END IFIF statementIF THEN ELSIF ELSE END IF 
IF (SELECT COUNT(*) ... ) > 0 THENSELECT COUNT(*) INTO cnt ...; IF cnt > 0 THEN
14label:Label declaration<<label>>
15LEAVE label;Leave a loopEXIT label;
16LOOP stmts END LOOP;A loop statementLOOP stmts END LOOP;
17REPEAT stmts UNTIL condition END REPEAT;Conditional loopLOOP stmts EXIT WHEN condition; END LOOP;
18RESIGNAL;Resignal the exceptionRAISE;
19SET v1 = valueAssignment statementv1 := value
SET v1 = valuev2 = value2, …v1 := valuev2 := value2; …
SET (v1, v2, …) = (value, value2, …)v1 := valuev2 := value2; …
SET (v1, v2, …) = (SELECT c1, c2, …)SELECT c1, c2, … INTO v1, v2, …
20SIGNAL SQLSTATE 'num' ('text')Raise an exceptionRAISE_APPLICATION_ERROR(-num, 'text')
21VALUES c1, … INTO v1, …Assignment statementv1 := c1; …
22WHILE condition DO sql END WHILEA loop statementWHILE condition LOOP sql END LOOP;

SQL Statements

Converting SQL statements from IBM DB2 to Oracle:

DB2Oracle
1COMMENT ON tab (col IS 'text')Comment on column (z/OS)COMMENT ON COLUMN tab.col IS 'text'
2CREATE AUXILIARY TABLE nameCreate a LOB table (z/OS)Commented
3CREATE DATABASE nameCreate a databaseCommented
4CREATE STOGROUP nameCreate a storage group (z/OS)Commented
5DECLARE GLOBAL TEMPORARY TABLECreate a temporary tableCREATE GLOBAL TEMPORARY TABLE
6DROP DATABASE nameDrop a databaseCommented
7DROP STOGROUP nameDrop a storage group (z/OS)Commented
8SET CURRENT PATH = listSet the current pathRemoved
9SET CURRENT SCHEMA = nameSet the current schemaALTER SESSION SET CURRENT_SCHEMA name
10UPDATE t1 SET (c1, c2, …) = (v1, v2, …)Update statementUPDATE t1 SET c1 = v1, c2 = v2, …
11VALUES c1, …Single-row result setSELECT c1, … FROM dual
VALUES c1, … INTO v1, …Assignment statementv1 := c1; …

CLP Commands

Converting Command Line Processor (CLP) commands from IBM DB2 to Oracle:

DB2Oracle
1EXPORT TO file OF DEL select_stmtExport to delimited ASCII fileSPOOL file; select_stmt; SPOOL OFF;

Error Codes and Messagges

Mapping error codes and messages from DB2 to Oracle:

DB2Oracle
1SQLSTATE '02000', SQLCODE 100Row not foundcur%NOTFOUND, SQL%NOTFOUND, SQLCODE 100
2SQLSTATE '23505'Unique constraint violationORA-00001 error, DUP_VAL_ON_INDEX exception
3SQLSTATE '8xxxx'User-defined error

Note: In Oracle you can use the SQLCODE variable in an exception handler only. 

출처: http://www.sqlines.com/db2-to-oracle

'DB' 카테고리의 다른 글

SQLite 공유 캐시 모드  (0) 2017.08.24
[Oracle] 시간 타입 컬럼 시분초 형태로 결과보기 (nls_date)  (0) 2017.06.28
ORACLE vs DB2  (0) 2017.05.30
(SQLite) SQLite with GPU  (0) 2017.04.30
(SQLITE) 참고 (링크)  (0) 2017.04.17
(SQLITE) Visual Studio  (0) 2017.04.17

SQLite 사용시 GPU 를 사용하여 성능 향상을 시킬수 있는 방법이 많이 나왔다.

아래가 참고 사이트

http://dl.acm.org/citation.cfm?doid=1735688.1735706

https://www.reddit.com/r/programming/comments/b61nk/sqlite_partially_implemented_on_cuda_2070x/

https://www.nextplatform.com/2015/06/26/gpu-accelerators-radically-boost-sql-queries/

'DB' 카테고리의 다른 글

[Oracle] 시간 타입 컬럼 시분초 형태로 결과보기 (nls_date)  (0) 2017.06.28
ORACLE vs DB2  (0) 2017.05.30
(SQLite) SQLite with GPU  (0) 2017.04.30
(SQLITE) 참고 (링크)  (0) 2017.04.17
(SQLITE) Visual Studio  (0) 2017.04.17
(SQLITE) Tool  (0) 2017.04.17

+ Recent posts

티스토리 툴바