oracle存儲過程異常捕獲學習,執行及演示過程:
存儲過程:
CREATE OR REPLACE PROCEDURE sp_test_2 ( param1 in int, --輸入參數 param2 in int, out_return out varchar2 --返回結果 ) is --全局變量 val int; errorException exception; --申明異常 errorCode number; --異常代號 errorMsg varchar2(1000); --異常信息 flag varchar2(10); begin flag := 'true'; out_return := 'flag=' || flag || ',errorCode=' || errorCode || ',errorMsg=' || errorMsg; val := param1/param2; --/* exception when errorException then errorCode := SQLCODE; errorMsg := SUBSTR(SQLERRM, 1, 200); flag := 'false'; out_return := 'flag=' || flag || ',errorCode=' || errorCode || ',errorMsg=' || errorMsg; when others then errorCode := SQLCODE; errorMsg := SUBSTR(SQLERRM, 1, 200); flag := 'false'; out_return := 'flag=' || flag || ',errorCode=' || errorCode || ',errorMsg=' || errorMsg; --dbms_output.put_line(errorCode || ',' || errorMsg); --*/ end sp_test_2;
演示存儲過程:
DECLARE out_return varchar2(1000); val int; --全局變量 errorException exception; --申明異常 errorCode number; --異常編碼 errorMsg varchar2(1000); --異常信息 flag varchar2(10); begin flag := 'true'; out_return := 'flag=' || flag || ',errorCode=' || errorCode || ',errorMsg=' || errorMsg; val := 1/0; exception --異常捕捉,不要把有需要的代碼放在異常捕捉后面,有異常才會執行異常代碼下所有代碼,沒有異常不會執行 when errorException then errorCode := SQLCODE; errorMsg := SUBSTR(SQLERRM, 1, 200); flag := 'false'; out_return := 'flag=' || flag || ',errorCode=' || errorCode || ',errorMsg=' || errorMsg; when others then errorCode := SQLCODE; errorMsg := SUBSTR(SQLERRM, 1, 200); flag := 'false'; out_return := 'flag=' || flag || ',errorCode=' || errorCode || ',errorMsg=' || errorMsg; dbms_output.put_line(out_return); end;
sqlplus中執行存儲過程:
DECLARE out_return varchar2(1000); begin sp_test_2(1,0,out_return); dbms_output.put_line(out_return); --打印結果 end;
執行存儲過程 1除以0 結果: