今天从A用户同步表数据到B用户时,且后续需定期进行同步。所以就想到了使用存储过程+定时器进行实现。但是没想到表中包含clob字段,存储过程中竟然无法通过竟然无法A.table方式进行实现。所以就通过创建DBLINK方式进行实现了。具体内容如下:
以下内容均在B用户下进行操作
1、对用户进行授权:
grant create table,connect,dba to A;
注:create table 需显示声明授权,否则存储过程在创建表时会提示权限不足。
2、创建DBLIN
create public databaselink dblink_A
connect A identified by aaa;
3、在B用创建存储过程
CREATE OR REPLACE PROCEDURE TRANSFER_A AUTHID current_user AS
CUR_ID NUMBER(4);
PLAN_COUNT NUMBER(4);
BEGIN
EXECUTE IMMEDIATE 'drop TABLE remote_A ';
EXECUTE IMMEDIATE 'CREATE TABLE remote_A AS SELECT * FROM table_A@dblink_A';
PLAN_COUNT := 0;
DECLARE
CURSOR A_CURSOR IS
SELECT ID,NAME,INFO
FROM remote_A T ;
BEGIN
FOR REC IN A_CURSOR LOOP
SELECT SEQ_TABLE_A.NEXTVAL INTO CUR_ID FROM DUAL;
INSERT INTO A (ID,NAME,INFO)
SELECT CUR_ID,NAME,INFO FROM DUAL;
PLAN_COUNT := PLAN_COUNT + 1;
END LOOP;
END;
COMMIT;
DBMS_OUTPUT.PUT_LINE('迁移完成,共迁移' || PLAN_COUNT || '条记录');
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
DBMS_OUTPUT.PUT_LINE('迁移失败');
END TRANSFER_A ;
4、创建job
declare
variable job number;
begin
sys.dbms_job.submit(job => :job,
what => 'TRANSFER_A ;',
next_date => to_date('25-10-2019 00:42:06', 'dd-mm-yyyy hh24:mi:ss'),
interval => 'sysdate+1/2');
commit;
end;
5、测试
测试通过,大功告成!!!