2015-11-16 33 views
1
时停止该过程批次

假设我有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语句忽略

达到了预期的结果,我的想法是(但我不知道该怎么办了!):

  1. 将异常处理添加到P2,例如它可以阻止P3运行。

  2. 运行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插,而我不想改变任何东西。

+0

请编辑您的问题,并包括您正在执行的代码。谢谢。 –

+0

也许我不是很了解,但是这三个程序只能放在一个包里吗?所以在包中运行proc 1,然后是proc 2,然后是proc3。如果事情向南并且你没有在他们的任何地方投入任何东西,那么所有的事情都会自动地被魔法般地推回给你。 –

回答

0

我添加一行到你的程序(和修改一下运行测试为例):

create or replace PROCEDURE ins(P_INPUT IN t.INPUT%TYPE DEFAULT NULL) AS 

invalid_input exception; 
BEGIN 
    IF P_INPUT NOT IN ('A','B','C') THEN 
     RAISE invalid_input; 
    END IF; 
    INSERT INTO t (INPUT) VALUES (P_INPUT); 
EXCEPTION 
    WHEN invalid_input THEN 
     DBMS_OUTPUT.PUT_LINE ('Invalid input'); 
     rollback;    ---How to stop next procedure from running? 
     raise;  -- re-raise exception added 
    WHEN others THEN 
     rollback; 
END; 

表:

create table t (input varchar2(1)); 

测试脚本:

SQL> declare 
    total_rows number; 
begin 
    ins('A'); 
    ins('D'); 
    ins('C'); 
exception 
    when others then 
    select count(*) into total_rows from t; 
    dbms_output.put_line('Error ocured. Total rows in table T: ' || total_rows); 
end; 
/
Invalid input 
Error ocured. Total rows in table T: 0 

PL/SQL procedure successfully completed. 

正如我明白,这是你想要的结果。

+0

谢谢你的回复。我在异常处理中添加了'raise',但它不能按预期工作。 –

+0

@MolderNg我改变了我的代码。检查,你需要什么? – Dmitry

+0

谢谢!其实我用raise_application_error来解决我的第二个问题,但你的解决方案就是我一开始就想要的。它运作良好,再次感谢! –