Database SQLite到Oracle

Database SQLite到Oracle,database,oracle,sqlite,Database,Oracle,Sqlite,我在一个系统中有一个SQLite数据库,我需要将存储在SQLite中的数据提取到Oracle数据库。如何执行此操作?您必须将SQLite转换为文本文件(不确定格式),然后使用Oracle从文本加载数据库(源代码为)。您可以使用SQLite interactive shell中的.dump命令转储到文本文件(有关语法,请参阅)。SQL Loader是一个实用程序,它将读取带分隔符的文本文件并将其导入oracle数据库。您需要映射出sqlite平面文件中的每一列与Oracle数据库中相应列的匹配方式

我在一个系统中有一个SQLite数据库,我需要将存储在SQLite中的数据提取到Oracle数据库。如何执行此操作?

您必须将SQLite转换为文本文件(不确定格式),然后使用Oracle从文本加载数据库(源代码为)。您可以使用SQLite interactive shell中的
.dump
命令转储到文本文件(有关语法,请参阅)。

SQL Loader是一个实用程序,它将读取带分隔符的文本文件并将其导入oracle数据库。您需要映射出sqlite平面文件中的每一列与Oracle数据库中相应列的匹配方式。以下是一个可以帮助您入门的好方法。

Oracle提供了名为(以前称为Oracle Database Lite)的产品,该产品允许您在SQLite和Oracle数据库之间进行同步。它提供可扩展的双向同步、模式映射、安全性等。移动服务器支持同步和异步数据同步。如果这不仅仅是一次导出,而且您需要保持SQLite和Oracle数据库的同步,那么这是一个很棒的工具


免责声明:我是Oracle Database Mobile Server的产品经理之一,所以我有点偏见。然而,移动服务器确实是保持SQLite(或Berkeley DB)和Oracle数据库同步的好工具

如果您是开发人员,您可以开发一个应用程序来执行同步。你会的

从sqlite\u master中选择名称,其中type='table'

要获取表名,可以使用
create table
命令在Oracle中重新创建它们(可以先在Oracle中执行
DROP table tablename
,以避免冲突,假设SQLite是权威的)。获取每一列所需的时间

从sqlite\u master中选择sql,其中type='table'和name='MyTable'

然后你必须分析结果:

string columnNames = sql.replace(/^[^\(]+\(([^\)]+)\)/g, '$1').replace(/ [^,]+/g, '').split(',');
string[] columnArray = columnNames.Split(',');
foreach (string s in columnArray)
{
    // Add column to table using:
    // ALTER TABLE MyTable ADD COLUMN s NVARCHAR(250)
}
可以使用
StringBuilder
收集表名及其列,以创建
INSERT
命令。要添加这些值,只需在循环过程中对每个表执行
SELECT*FROM MyTable
,遍历从初始查询返回的表名即可。您将迭代返回的数据表行的列,并将值添加到
StringBuilder

插入MyTable(
+columnA、columnB等)+
)值(
数据行[0]、数据行[1]等)+

不过,情况并非如此——在循环中运行时,通过附加列名及其数据来填充数据。您可以通过在上面的
foreach
循环中添加
s
来获取列名。然后使用
foreach
循环设置每个列的值,该循环提供drData.ItemArray中的每个
对象obj。如果您只有字符串字段,那么很简单,您只需为查询中的每个列值添加
obj.ToString()
。然后在收集每行的所有列值后运行查询。您为每一行使用一个新的
StringBuilder
——它需要重置为
插入MyTable(
+columnA、columnB等)+
)值(
在每一新行之前,因此可以追加新的列值

如果您有混合数据类型(即
DATE
BLOB
等),您需要在此过程中确定列类型,将其存储在列表或数组中,然后使用计数器确定该列表/数组插槽的索引并获取类型,这样您就知道如何将对象转换为Oracle可以使用的内容—这是否意味着只需将
添加到\u date()
结果中,并对日期进行格式化(因为SQLite将这些字符串存储为日期字符串,格式为
yyyy-MM-dd HH:MM:ss
),或者将其添加到
OracleParameter
BLOB
中,并将其发送到
RunOracleCommand
函数中。(下面我没有讨论这个。)

将所有这些放在一起可以得到:

string[] columnArray = null;
DataTable dtTableNames = GetSQLiteTable("SELECT name FROM sqlite_master WHERE type='table'");
if (dtTableNames != null && dtTableNames.Rows != null)
{
    if (dtTableNames.Rows.Count > 0)
    {
        // We have tables
        foreach (DataRow dr in dtTableNames.Rows)
        {
            // Do everything about this table here
            StringBuilder sb = new StringBuilder();
            sb.Append("INSERT INTO " + tableName + " ("); // we will collect column names here

            string tableName = dr["NAME"] != null ? dr["NAME"].ToString() : String.Empty;
            if (!String.IsNullOrEmpty(tableName))
            {
                RunOracleCommand("DROP TABLE " + tableName);
                RunOracleCommand("CREATE TABLE " + tableName);
            }

            DataTable dtColumnNames = GetSQLiteTable("SELECT sql FROM sqlite_master WHERE type='table' AND name='"+tableName+"'");
            if (dtColumnNames != null && dtColumnNames.Rows != null)
            {
                 if (dtColumnNames.Rows.Count > 0)
                 {
                     // We have columns
                     foreach (DataRow drCol in dtTableNames.Rows)
                     {
                          string sql = drCol["SQL"] != null ? drCol["SQL"].ToString() : String.Empty;
                          if (!String.IsNullOrEmpty(sql))
                          {
                              string columnNames = sql.replace(/^[^\(]+\(([^\)]+)\)/g, '$1').replace(/ [^,]+/g, '').split(',');
                              columnArray = columnNames.Split(',');
                              foreach (string s in columnArray)
                              {
                                  // Add column to table using:
                                  RunOracleCommand("ALTER TABLE " + tableName + " ADD COLUMN " + s + " NVARCHAR(250)"); // can hard-code like this or use logic to determine the datatype/column width
                                  sb.Append("'" + s + "',");
                              }
                              sb.TrimEnd(",");
                              sb.Append(") VALUES (");
                          }
                      }
                  }
             }

            // Get SQLite Table data for insertion to Oracle
            DataTable dtTableData = GetSQLiteTable("SELECT * FROM " + tableName);
            if (dtTableData != null && dtTableData.Rows != null)
            {
                 if (dtTableData.Rows.Count > 0)
                 {
                     // We have data
                     foreach (DataRow drData in dtTableData.Rows)
                     {
                         StringBuilder sbRow = sb; // resets to baseline for each row
                         foreach (object obj in drData.ItemArray)
                         {
                             // This is simplistic and assumes you have string data for an NVARCHAR field
                             sbRow.Append("'" + obj.ToString() + "',");
                         }
                         sbRow.TrimEnd(",");
                         sbRow.Append(")");
                         RunOracleCommand(sbRow.ToString());
                     }
                 }
            }
        }
    }
}
所有这些都假设您有一个
RunOracleCommand()
void函数,该函数可以接受SQL命令并对Oracle DB运行该命令,还有一个
GetSQLiteTable()
函数,该函数可以通过传递SQL命令从SQLite DB返回数据表

请注意,正如我在本文中直接编写的那样,这段代码未经测试,但它在很大程度上是基于我为将Oracle同步到SQLite而编写的代码,该代码已经过测试并可以正常工作