我有两个数据库 一个A 数据库 一个B数据库
B数据库需要同步A数据库中的数据 在A数据库中有一个中间表 通过中间表可以知道修改过哪些数据,添加了哪些数据。
每一次同步的时候数据量都能上万条。具体数目不详。估计在一万条以上,五万条以下。
我想请问下 需不需要使用游标?
如果需要使用游标该怎么使用。
对于数据库游标我还是个新手。希望各位大侠多多指点。
create or replace procedure pro_Test as
DATA_COUNT NUMBER;
DATESTR DATE; --当前系统时间
begin
--把系统时间付给变量DATESTR
SELECT TO_DATE(TO_CHAR(SYSDATE, 'YYYY-MM-DD'), 'YYYY-MM-DD')
INTO DATESTR
FROM DUAL;
begin
通过中间表找到修改过的数据和添加的数据
begin
if DATA_COUNT > 0 then
删除在A数据库中已修改的数据
commit;
end if;
添加数据
commit;
exception when others then rollback;
end;
end;
end pro_Test;
如果有必要使用游标,我想500条提交一次。或者更多。
代码怎么写或者思路是怎样的。知道的大侠指点以下迷津。
B数据库需要同步A数据库中的数据 在A数据库中有一个中间表 通过中间表可以知道修改过哪些数据,添加了哪些数据。
每一次同步的时候数据量都能上万条。具体数目不详。估计在一万条以上,五万条以下。
我想请问下 需不需要使用游标?
如果需要使用游标该怎么使用。
对于数据库游标我还是个新手。希望各位大侠多多指点。
create or replace procedure pro_Test as
DATA_COUNT NUMBER;
DATESTR DATE; --当前系统时间
begin
--把系统时间付给变量DATESTR
SELECT TO_DATE(TO_CHAR(SYSDATE, 'YYYY-MM-DD'), 'YYYY-MM-DD')
INTO DATESTR
FROM DUAL;
begin
通过中间表找到修改过的数据和添加的数据
begin
if DATA_COUNT > 0 then
删除在A数据库中已修改的数据
commit;
end if;
添加数据
commit;
exception when others then rollback;
end;
end;
end pro_Test;
如果有必要使用游标,我想500条提交一次。或者更多。
代码怎么写或者思路是怎样的。知道的大侠指点以下迷津。
DATA_COUNT NUMBER;
DATESTR DATE; --当前系统时间
CURSOR CUR_UPDATE IS SELECT * FROM TAB@A WHERE DATETIME = DATESTR; -- 获取 A 库中间表记录
begin
--把系统时间付给变量DATESTR
--SELECT TO_DATE(TO_CHAR(SYSDATE, 'YYYY-MM-DD'), 'YYYY-MM-DD')
--INTO DATESTR
--FROM DUAL;
DATESTR := TRUNC(SYSDATE,'DD');
FOR UP_DATA IN CUR_UPDATE
LOOP
delete from tab where xx = UP_DATA.xx;
insert into tab values(UP_DATA.xx, UP_DATA.XXX);
END LOOP; commit;
end pro_Test;
如果你想每 500 条提交一次的话,可以加一个判断进去if (mod(CUR_UPDATE, 500) = 0) then
commit;
end if;如果你的数据量比较大的话,事务占用资源比较多,执行到后面就会比较慢
if (mod(CUR_UPDATE%ROWCOUNT, 500) = 0) then
commit;
end if;上面笔误
MERGE INTO B库目标表 alias1
USING (A库源表和中间表) alias2
ON (join condition)
WHEN MATCHED THEN
UPDATE table_name
SET col1 = col_val1,
col2 = col2_val
WHEN NOT MATCHED THEN
INSERT (column_list) VALUES (column_values);