2011-03-04 6 views
8

私はSQLiteデータベースを1つのシステムに持っているので、SQLiteに格納されたデータをOracleデータベースに抽出する必要があります。これはどうすればいいですか?SQLite to Oracle

答えて

0

SQLiteをテキストファイル(形式が特定されていない)に変換してから、Oracleを使用してテキストからデータベースをロードする必要があります(ソースはhttp://www.orafaq.com/wiki/SQLite)。 SQLiteの対話シェルから.dumpコマンドを使用してテキストファイルにダンプすることができます(構文についてはthe docsを参照してください)。

0

SQLローダーは、区切られたテキストファイルを読み込んでOracleデータベースにインポートするユーティリティです。フラット・ファイルからsqliteの各列がOracleデータベースの対応する列にどのように一致するかをマップする必要があります。ここでは、あなたが始めるのに役立つ良いFAQです。

7

Oracleには、Oracle Database Mobile Server(以前はOracle Database Liteと呼ばれていた製品)があり、SQLiteとOracleデータベースの間で同期化することができます。スケーラブルな双方向同期、スキーママッピング、セキュリティなどを提供します。Mobileサーバーは、同期データ同期と非同期データ同期の両方をサポートします。これが1回限りのエクスポートであり、SQLiteとOracleデータベースを同期させておく必要がある場合、これは素晴らしいツールです!

免責事項:私はOracle Database Mobile Serverのプロダクト・マネージャの1つで、私は少し偏っています。しかし、Mobileサーバーは、SQLite(またはBerkeley DB)とOracleデータベースを同期させておくための優れたツールです。

0

開発者は、同期を実行するアプリケーションを開発することができます。あなたは、あなたがCREATE TABLEコマンドで(あなたはSQLiteのは権威になると仮定すると、競合を避けるために、最初のOracleでDROP TABLE tablenameを行うことができます)のOracleでそれらを再作成することができ、テーブル名を取得するために

SELECT name FROM sqlite_master WHERE type='table'

を行うだろう。それぞれの列を取得する

SELECT sql FROM sqlite_master WHERE type='table' and 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に値を追加します。

INSERT INTO MyTable ( + columnA、columnBなど+ ) VALUES (のDataRow [0]、データロー[1]など+ )

そうではありませんが、ループを実行するときに列名とそのデータを追加してデータを入力します。上記のforeachループの中にsを追加することによって列名を得ることができます。それぞれの列の値は、foreachループを使用して設定されます。これはそれぞれobject obj in drData.ItemArrayです。文字列フィールドをすべて持っている場合は簡単ですが、StringBuilderには、以下のようにクエリの各列の値にobj.ToString()を追加してください。次に、各行のすべての列値を収集した後で照会を実行します。各行に新しいStringBuilderを使用します。INSERT INTO MyTable ( + columnA、columnBなどにリセットする必要があります。新しい行の前に+ ) VALUES (を追加すると、新しい列の値を追加できます。

データ型が混在している場合(つまり、DATEBLOBなど)、途中で列の種類を判断し、リストまたは配列に格納し、カウンタを使用してインデックスを決定する必要がありますリスト/配列のスロットを取得して型を取得することで、オブジェクトをOracleが使用できるものに変換する方法を知ることができます。つまり、書式設定を使用してto_date()を日付に追加するだけです(SQLiteでは、 yyyy-MM-dd HH:mm:ss)、それをBLOBOracleParameterに追加し、それを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()); 
        } 
       } 
      } 
     } 
    } 
} 

このすべては、あなたがSQLコマンドを取り、に対してそれを実行することができますRunOracleCommand() void関数を持っていると仮定しOracle DB、およびGetSQLiteTable()関数は、SQLコマンドを渡してSQLite DBからDataTableを返すことができます。

このコードは、この記事で直接書いたので、テストされていませんが、テスト済みで動作するSQLiteにOracleを同期するためのコードに大きく基づいています。