2017-12-08 11 views
-1

私は2つのシステムソースと宛先を持っています。どちらのシステムも同じ名前のテーブルはありませんでした。しかし、宛先システム表にはソースシステム表よりも多くの列がありました。私は、宛先システムの新しい列を更新せずに、ソースシステムダンプを宛先システムにエクスポートしたい。ソースシステムからデータをエクスポートし、更新モードで宛先システムにインポート

例:ソースシステム、

T1->名= ''、性別= 'F'、ID = 1つの

先システム

T1->名= 'A1'、 sex = 'F'、id = 1、[email protected]

宛先システムにダンプインをインポートし、電子メールフィールドを更新せずにt1テーブルを更新したいとします。 どうすればいいですか?

+0

テーブルの数。 1つのテーブルに対してのみ 'Merge' – XING

+0

テーブルが50個以上ある場合 –

+0

次に入力をソーステーブル、デスティネーションテーブル、テーブルのpkとして取得し、動的SQLを使用してカラムをマージするプロシージャを作成する必要があります – XING

答えて

0

私のサンプルデータで実行したコードを以下で見つけてください。あなたの環境でそれを実行し、あなたの問題を解決するかどうか確認してください。

少数の仮定:
1)ターゲット・スキーマ名は@Target_Schema IS(コードでは、ソース・スキーマ内の各表更新するPKを持つべきである)
3)ターゲット・スキーマ名で@Target_schemaを交換してください。
4.ソースのテーブルにコンポジットPKがないことを確認してください。
5.)TGTスキーマでは、TGTスキーマ内でDML特権を更新または挿入する必要があります。

コード:

CREATE TABLE ANK1 
      (
      ID NUMBER, 
      NAME VARCHAR2(4000), 
      ); 

      ALTER TABLE ank1 
      ADD CONSTRAINT ANK_PK PRIMARY KEY (ID); 

      insert into ANK1 values(1,'abc'); 
      commit; 

      CREATE TABLE @Target_Schema.ANK1 
      (
      ID NUMBER, 
      NAME VARCHAR2(4000), 
      EMAIL VARCHAR2(4000) 
      ); 


    SET SERVEROUTPUT ON 
declare 
p_key_col varchar2(40); 
l_merge_sql varchar2(4000); 
begin 
for cur_tab in (SELECT * FROM (
SELECT UTC.TABLE_NAME,UTC.COLUMN_NAME,UCC.COLUMN_NAME AS PK_COL FROM USER_TAB_COLS UTC,USER_CONSTRAINTS UC,USER_CONS_COLUMNS UCC WHERE UTC.TABLE_NAME IN ('ANK1') 
AND UTC.TABLE_NAME = UC.TABLE_NAME AND UC.CONSTRAINT_TYPE = 'P' AND UC.CONSTRAINT_NAME = UCC.CONSTRAINT_NAME) WHERE PK_COL <> COLUMN_NAME) loop 


    l_merge_sql:= 'MERGE INTO @Target_Schema.'||cur_tab.table_name||' T_TABLE 
    USING '||cur_tab.table_name||' SRC 
     ON (T_TABLE.'||cur_tab.PK_COL||' = SRC.'||cur_tab.PK_COL||') 

    WHEN MATCHED THEN 
      UPDATE 
      SET T_TABLE.'||cur_tab.COLUMN_NAME||' = SRC.'||cur_tab.COLUMN_NAME||' 

    WHEN NOT MATCHED THEN 
      INSERT (T_TABLE.'||cur_tab.PK_COL||', T_TABLE.'||cur_tab.COLUMN_NAME||') 
      VALUES (SRC.'||cur_tab.PK_COL||', SRC.'||cur_tab.COLUMN_NAME||')'; 
    DBMS_OUTPUT.PUT_LINE(l_merge_sql); 

END LOOP; 

END; 

あなたが印刷されたMERGE文を取得し、あなたが結果を確認することを別々に実行することができます。

これが問題を解決することを願っています。

関連する問題