CREATE OR REPLACE PROCEDURE ZENG_Proc1
IS
v_To VARCHAR2(30);
v_Ti VARCHAR2(30);
v_P VARCHAR2(30);
v_P2 VARCHAR2(30);
v_Col VARCHAR2(30);
v_Col2 VARCHAR2(30);
Sql_srv VARCHAR2(2000);
v_Insert VARCHAR2(600);
v_Update VARCHAR2(800);
v_Values VARCHAR2(600);
BEGIN
--从中间表取得表名,主键名 ,预定义更新、插入语句
FOR r IN (SELECT tableout,TABLEIN,PRIMARY_KEY FROM ZENG_TABLE )LOOP
v_To:= r.tableout;
v_Ti:= r.tablein;
v_P:=','||r.primary_key||',';
v_Update:= NULL;
v_Insert:= NULL;
v_Values:= NULL;
v_P2:= NULL;
--定义更新、插入语句,v_col为列名,v_p2为主键合集,v_update为更新字段,v_insert为插入字段,v_values为插入值
FOR k IN(SELECT column_name FROM user_tab_cols WHERE table_name=v_To)LOOP
v_Col:=k.column_name;
v_Col2:=','||v_Col||',';--加入逗号便于排除主键列名含于其他列名的影响
v_Insert:=v_To||'.'||v_Col||','||v_Insert;
v_Values:='INTF_OSS_APP.'||v_Ti||'@TO_INTF.'||v_Col||','||v_Values;--@dblink
IF INSTR('v_P','v_Col2',1,length(v_P))>0
THEN v_P2:=v_To||'.'||v_Col||'='||'INTF_OSS_APP.'||v_Ti||'@TO_INTF.'||v_Col||','||v_P2;--@dblink
ELSE
v_Update:=v_To||'.'||v_Col||'='||'INTF_OSS_APP.'||v_Ti||'@TO_INTF.'||v_Col||','||v_Update;--@dblink
END IF;
END LOOP;
v_Update:=SUBSTR(v_Update,1,(LENGTH(v_Update)-1));
v_Insert:=SUBSTR(v_Insert,1,(LENGTH(v_Insert)-1));
v_Values:=SUBSTR(v_Values,1,(LENGTH(v_Values)-1));
v_P2:=SUBSTR(v_P2,1,(LENGTH(v_P2)-1));
--实现更新插入功能
Sql_srv:='MERGE INTO'||' '||v_To||' '||'USING'||' '|| v_Ti||' '||'ON('||v_P2
||')'||' '||'WHEN MATCH THEN UPDATE SET'||' '||v_Update||' '
||'WHEN NOT MATCHED THEN INSERT('||v_Insert||')VALUES('||v_Values||')';
EXECUTE IMMEDIATE Sql_srv;
END LOOP;
--报错
EXCEPTION
WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('更新错误');
END ZENG_Proc1;
调用用
BEGIN
ZENG_PROC1;
END;
然后一点用都没有,到底是哪里出错了.....
注,函数是为了实现建立数据链路动态更新本地表,我建了个中间表,外源表名、本地表名、主键三列,二重循环MERGE实现