2017-10-30 26 views
0

MS SQL(AWS EC2)テーブルからOracle(AWS RDS)インスタンスへデータを複製する必要があります。いくつかのアプローチが失敗した後、私はOraデータベースにSQLでリンクサーバーを作成し、トリガーイベントに新しいデータを挿入することに決めました。ここまでは順調ですね。今、私は供給desora12 『『リンクサーバー用の』OraOLEDB.Oracle「OLE DBプロバイダ』を[同じ] SQLテーブルから単一のOracleテーブルにデータを挿入しますが、次のエラーMS SQLからOracleにリンクされたサーバー。無効なメタデータのカラム

を受信しようとしています

列「CREATE_DATE」のメタデータが無効です。データ型はサポートされていません。

私は、CREATE_DATEをinsertステートメントから取り出してみましたが、同じエラーが発生しました。私はまた、キャストして、CreateDateをselect文で変換しようとしました。同じエラー。

OracleのCREATE_DATE列型は、TIMESTAMP(6)です。 対応するSQLのCreateDate列の型はNULLです。DateTime

表には31個の列があります。ここには挿入の要約版があります。

INSERT INTO [desora12]..[DATAENTRY].[TBL_API_ITEM_TYPEID1_LBL_TEST] 
     ([SITE_ID] 
     ,[USER_ID] 
     ,[CREATE_DATE] 
     ,[TRANSFER_DATE] 
     ,[TRANSFER_STATUS]) 
SELECT TOP 1 SiteID, 
     UserID, 
     CreateDate, 
     TransferDate, 
     TransferStatus 
    FROM API.ItemDataTypeID1Label 
     WHERE TransferDate is null 
     AND TransferStatus is null 
     AND ReturnStatus=200 

助けが必要ですか?

+0

質問を編集し、使用しているコードを表示してください。 –

+0

Oracleの日付フィールドにMSSqlのdatetime値を挿入してみます。それが成功したら、ステージングテーブルに最初に挿入し、ステージングテーブルから本番テーブルに書き込みます。 –

答えて

1

あなたがやっているような「プッシュ」ではなく、常にデータを転送するために「プル」します。プルは、開発データベースまたはテスト・データベースをリフレッシュするときに本番データベースに損害を与えないようにします。日程が変わるまで、私はOracleとSQL Serverの間の日付タイプに苦労しました。私は最終的に私のOracleの日付をテキストに変換しました(私が引っ張っていることを覚えておいてください)。私はOracleの日付を文字列に変換するbindvarの呼び出しでこれを見ることができます。

Oracleを使用している場合は、DBMS_HS_PASSTHROUGHを参照してください。データベースリンクを使用して選択するよりも何倍も高速です。私は一度に200万レコードを取得しています。実行時間は4 1/2時間から5分になりました。

PROCEDURE bindvar (
     p_cursor IN INTEGER 
     , p_pos  IN INTEGER 
     , p_value IN VARCHAR2 
    ) 
    AS 
     l_routine CONSTANT oracleobj_t := 'bindvar'; 
    BEGIN 
     [email protected] (p_cursor, p_pos, p_value); 
    EXCEPTION 
     WHEN OTHERS 
     THEN 
      make_log_error_entry (
       p_routine => l_routine 
       , p_message => cealogging.activity_log_maintenance_pkg.labels (
           'p_cursor' 
           , p_cursor 
           , 'p_pos' 
           , p_pos 
           , 'p_value' 
           , p_value 
          ) 
      ); 
      RAISE; 
    END; 

-- *********************************************************************** 
    -- Fetch Interval Data 
    -- Purpose: 
    -- Retrieve interval data from SQL*Server 
    -- Arguments: 
    -- p_earliestintervaldate - earliest interval date from which data will be fetched 
    -- p_latestintervaldate - latest interval date from which data will be fetched 
    -- p_earliestlogtime  - earliest log date for which data will be fetched 
    -- p_latestlogtime  - latest log date for which data will be fetched 
    -- p_maxrecords - maximum records to fetch from SQL Server 
     -- *********************************************************************** 
    FUNCTION fetch_intervaldata (
     p_earliestintervaldate IN DATE 
     , p_latestintervaldate  IN DATE 
     , p_earliestlogdate  IN DATE 
     , p_latestlogdate   IN DATE 
     , p_meterno    IN VARCHAR2 DEFAULT NULL 
     , p_maxrecords    IN INTEGER DEFAULT NULL 
    ) 
     RETURN PLS_INTEGER 
    AS 
     l_routine CONSTANT oracleobj_t := 'fetch_intervaldata'; 
     l_format CONSTANT oracleobj_t := 'YYYYMMDD HH24:MI:SS'; 

     l_cnt    PLS_INTEGER; 
     l_cursor    INTEGER; 
     l_earliestlogdate DATE := p_earliestlogdate; 
     l_numrows   INTEGER; 
     l_row    intervaldata_load%ROWTYPE; 
     l_ret    PLS_INTEGER := 0; 
     l_sql    VARCHAR2 (200) 
      := ';select * from cea.fetchCisIntervalData( ?, ?, ?, ?, ?) where interval_read is not null'; 
     l_latestlogtimearg DATE; 
    BEGIN 

     close_databaselink (p_link => 'INTERVALDATA.WORLD'); 

     EXECUTE IMMEDIATE 'truncate table intervaldata_load'; 

     -- set l_cnt = 1 to allow the first pass to run 
     -- thereafter it is the number or records returned by the pass that will 
     -- be tested for continuation 
     l_cnt := 1; 

     WHILE l_earliestlogdate <= p_latestlogdate 
      AND l_cnt > 0 
      AND (p_maxrecords IS NULL 
      OR l_ret < p_maxrecords) 
     LOOP 
      make_log_entry (
       p_routine => l_routine 
       , p_message => 'processing starting for ' || TO_CHAR (l_earliestlogdate, c_intervaldateformat) 
      ); 

      l_cursor   := [email protected]; 
      [email protected] (l_cursor, l_sql); 
      bindvar (p_cursor => l_cursor, p_pos => 1, p_value => TO_CHAR (l_earliestlogdate, l_format)); 
      bindvar (
       p_cursor => l_cursor 
       , p_pos => 2 
       , p_value => TO_CHAR (l_earliestlogdate + INTERVAL '6' HOUR - INTERVAL '1' SECOND, l_format) 
      ); 
      bindvar (p_cursor => l_cursor, p_pos => 3, p_value => TO_CHAR (p_earliestintervaldate, l_format)); 
      bindvar (p_cursor => l_cursor, p_pos => 4, p_value => TO_CHAR (p_latestintervaldate, l_format)); 
      bindvar (p_cursor => l_cursor, p_pos => 5, p_value => p_meterno); 
      l_cnt    := 0; 

      LOOP 
       l_numrows := [email protected] (l_cursor); 
       EXIT WHEN l_numrows = 0 
         OR (p_maxrecords IS NOT NULL 
         AND l_ret >= p_maxrecords); 
       [email protected] (l_cursor, 1, l_row.meterno); 
       [email protected] (l_cursor, 2, l_row.interval_start); 
       [email protected] (l_cursor, 3, l_row.endpointid); 
       [email protected] (l_cursor, 4, l_row.logtime); 
       [email protected] (l_cursor, 5, l_row.interval_read); 
       [email protected] (l_cursor, 6, l_row.buy_back); 
       [email protected] (l_cursor, 7, l_row.phase_a); 
       [email protected] (l_cursor, 8, l_row.phase_b); 
       [email protected] (l_cursor, 9, l_row.phase_b); 
       EXIT WHEN l_row.logtime > p_latestlogdate; 

       INSERT INTO intervaldata_load 
       VALUES l_row; 

       l_cnt  := l_cnt + 1; 
       l_ret  := l_ret + 1; 

      END LOOP; 

      [email protected] (l_cursor); 

      make_log_entry (
       p_routine => l_routine 
       , p_message => LPAD (l_cnt, 10) 
          || ' records retrieved for ' 
          || TO_CHAR (l_earliestlogdate, c_intervaldateformat) 
          || ' to ' 
          || TO_CHAR (l_earliestlogdate + INTERVAL '6' HOUR, c_intervaldateformat) 
      ); 

      l_earliestlogdate := l_earliestlogdate + INTERVAL '6' HOUR; 
     END LOOP; 

     RETURN l_ret; 
    EXCEPTION 
     WHEN OTHERS 
     THEN 
      make_log_error_entry (
       p_routine => l_routine 
       , p_message => 'processing ' || TO_CHAR (l_earliestlogdate, l_format) 
      ); 
      [email protected] (l_cursor); 
      RAISE; 
    END fetch_intervaldata; 
関連する問題