在oracle中从一个数据库回滚到另一个数据库

时间:2013-11-25 10:12:01

标签: oracle stored-procedures oracle11g oracle10g

我有两个数据库 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 数据库进行回滚

请提前帮助我解决此问题

2 个答案:

答案 0 :(得分:0)

在针对Oracle数据库服务器部署多个PL/SQL routines(存储过程,用户定义函数和程序包)时,“在错误时停止并回滚”选项不起作用。

不要使用'错误时停止和回滚'错误处理选项对Oracle部署多个PL/SQL routines

如果由于遇到错误而需要更新或删除部署的例程,

在部署过程完成后,通过在SQL结果视图中识别受影响的例程并根据需要删除和重新部署例程来执行此操作。

答案 1 :(得分:0)

db2 上的savepoint之前创建insert并执行rollback到特定savepoint这解决了问题

特别感谢@ Jorge Campos