我有两个数据库 DB1 和 DB2 ,使用以下存储过程将数据从一个数据库存档到另一个数据库
CREATE OR REPLACE PROCEDURE "DB1"."ARCHIVE"(FROM_ARCHIVE timestamp, TO_ARCHIVE timestamp)
AS
v_err_num NUMBER;
v_err_msg VARCHAR2(200);
CURSOR MY_CURSOR IS
SELECT
ID,A,B,C
FROM
TABLE1 WHERE A >= FROM_ARCHIVE AND A <= TO_ARCHIVE
BEGIN
FOR MY_LOOP IN MY_CURSOR
LOOP
BEGIN
INSERT
INTO
DB2.TABLE2
(
A,B,C
)
VALUES
(
MY_LOOP.A,MY_LOOP.B,MY_LOOP.C
);
END;
END LOOP;
FOR MY_LOOP IN MY_CURSOR
LOOP
BEGIN
DELETE FROM TABLE1 Where A = MY_LOOP.ID;
END;
END LOOP;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;--if exception occures the rollback happening for the DB1 database only and not happening for DB2
COMMIT;
END;
此处如果 TABLE1 删除语句中发生异常,则仅针对DB1数据库进行回滚而不会针对 DB2
进行回滚有没有办法对特定的 DB2 数据库进行回滚
请提前帮助我解决此问题
答案 0 :(得分:0)
在针对Oracle数据库服务器部署多个PL/SQL routines
(存储过程,用户定义函数和程序包)时,“在错误时停止并回滚”选项不起作用。
不要使用'错误时停止和回滚'错误处理选项对Oracle部署多个PL/SQL routines
。
如果由于遇到错误而需要更新或删除部署的例程,
在部署过程完成后,通过在SQL结果视图中识别受影响的例程并根据需要删除和重新部署例程来执行此操作。
答案 1 :(得分:0)
在 db2 上的savepoint
之前创建insert
并执行rollback
到特定savepoint
这解决了问题
特别感谢@ Jorge Campos