簡體   English   中英

Oracle PL / SQL:遇到異常時停止過程批處理

[英]Oracle PL/SQL: Stop the procedure batch when encountering exception

假設我有3個程序一起運行,分別插入記錄A,B,C:

執行P1
執行P2執行P3

假設P2將引發異常,而P1和P3可以。

我的預期流程是:運行P1->插入->運行P2->遇到異常->回滾->停止運行P3

最終的預期結果沒有改變。

我為P2定義了異常和異常處理,它將回滾。 但是,我不能阻止它運行P3,即仍插入C。

Google告訴我存在WHENEVER SQLERROR EXIT ROLLBACK ,但是我發現它無法處理自定義異常。 換句話說,它僅適用於Oracle官方異常,例如:

第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,而我什么也不想改變。

我向您的過程添加了一行(並做了一些改動以運行測試示例):

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.

據我了解,這是您想要的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM