[英]Raising an Exception in PL/SQL or SQL Oracle Developer within a Stored Procedure
[英]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語句已忽略
為了達到預期的結果,我的想法是(但我不知道該怎么做!):
向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,而我什么也不想改變。
我向您的過程添加了一行(並做了一些改動以運行測試示例):
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.