假设我有3个程序一起运行,其中插入记录A,B,分别C:甲骨文PL/SQL:遇到例外
EXEC P1
EXEC P2 EXEC P3
假设P2会抛出异常,而P1和P3都没问题。
我的流量预计为: 运行P1 - >一个插入 - >运行P2 - >遇到异常 - >还原 - >运行P3
最终的预期结果是什么都没有改变停止。
我为P2定义了异常和异常处理,它将回滚。但是,我无法阻止它运行P3,即C仍然被插入。
谷歌告诉我有WHENEVER SQLERROR EXIT ROLLBACK
,但我发现它不能在自定义异常。换句话说,它只能在Oracle官方例外,如:
ERROR位于第2行: ORA-06550:第2行,第10列: PLS-00201:标识符 'COLUMN_DOES_NOT_EXIST' 必须被声明 ORA -06550:线2条,第3栏: PL/SQL:SQL语句忽略
达到了预期的结果,我的想法是(但我不知道该怎么办了!):
将异常处理添加到P2,例如它可以阻止P3运行。
运行
WHENEVER SQLERROR EXIT ROLLBACK
运行该程序之前。 (但只能在Oracle官方的异常工作,而不是我定义的异常的)
我感谢您的帮助,如果你能解决任何一个。
以下是我对你的参考代码:
PROCEDURE INSERT(
INPUT IN TABLE.INPUT%TYPE DEFAULT NULL
) AS
BEGIN
IF INPUT NOT IN ('A','B','C') THEN
RAISE invalid_input;
END IF;
INSERT INTO (...) VALUES (...);
EXCEPTION
WHEN invalid_input THEN
DBMS_OUTPUT.PUT_LINE ('Invalid input');
rollback; ---How to stop next procedure from running?
WHEN others THEN
rollback;
END;
当我运行 EXEC INSERT(A) EXEC INSERT(Y) EXEC INSERT(C), 结果是,C插,而我不想改变任何东西。
请编辑您的问题,并包括您正在执行的代码。谢谢。 –
也许我不是很了解,但是这三个程序只能放在一个包里吗?所以在包中运行proc 1,然后是proc 2,然后是proc3。如果事情向南并且你没有在他们的任何地方投入任何东西,那么所有的事情都会自动地被魔法般地推回给你。 –