私のサンプルデータで実行したコードを以下で見つけてください。あなたの環境でそれを実行し、あなたの問題を解決するかどうか確認してください。
少数の仮定:
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文を取得し、あなたが結果を確認することを別々に実行することができます。
これが問題を解決することを願っています。
テーブルの数。 1つのテーブルに対してのみ 'Merge' – XING
テーブルが50個以上ある場合 –
次に入力をソーステーブル、デスティネーションテーブル、テーブルのpkとして取得し、動的SQLを使用してカラムをマージするプロシージャを作成する必要があります – XING