內層程式中發生異常後,不會繼續執行外層程式的語句
開發寫了個儲存過程需要我們審批,發現子程式中使用了異常處理語句,
通過以下實驗說明這種寫法的問題:
SQL> create table test_number(test_id number);
Table created
Executed in 0.031 seconds
不使用子程式,正常執行:
SQL> declare
2 v_err_mess varchar2(200);
3 n_count number;
4 begin
5 select count(1) into n_count from test_number;
6 dbms_output.put_line(n_count);
7 exception
8 when others then
9 v_err_mess:=sqlcode||' '||sqlerrm;
10 dbms_output.put_line(v_err_mess);
11 end;
12 /
0
PL/SQL procedure successfully completed
不使用子程式,異常執行:
SQL> declare
2 v_err_mess varchar2(200);
3 n_count number;
4 begin
5 select test_id into n_count from test_number;
6 dbms_output.put_line(n_count);
7 exception
8 when others then
9 v_err_mess:=sqlcode||' '||sqlerrm;
10 dbms_output.put_line(v_err_mess);
11 end;
12 /
100 ORA-01403: 未找到任何資料
PL/SQL procedure successfully completed
使用子程式,在子程式中進行異常處理:
可以看到,在外層呼叫中無法獲取子程式異常處理中的賦值
SQL>
SQL> declare
2 v_err_mess varchar2(200);
3 n_count number;
4 begin
5 begin
6 select test_id into n_count from test_number;
7 dbms_output.put_line(n_count);
8 exception
9 when others then
10 v_err_mess:=sqlcode||' '||sqlerrm;
11 dbms_output.put_line(v_err_mess);
12 end;
13
14 dbms_output.put_line('inner layer values:'||n_count);
15 exception
16 when others then
17 v_err_mess:='out_layer:'||sqlerrm;
18 dbms_output.put_line(v_err_mess);
19 end;
20 /
100 ORA-01403: 未找到任何資料
inner layer values:
PL/SQL procedure successfully completed
使用子程式,在子程式中進行正常處理:
可以看到,在外層呼叫中可以獲取子程式中的賦值
SQL> declare
2 v_err_mess varchar2(200);
3 n_count number;
4 begin
5 begin
6 select count(1) into n_count from test_number;
7 dbms_output.put_line(n_count);
8 exception
9 when others then
10 v_err_mess:=sqlcode||' '||sqlerrm;
11 dbms_output.put_line(v_err_mess);
12 end;
13
14 dbms_output.put_line('inner layer values:'||n_count);
15 exception
16 when others then
17 v_err_mess:='out_layer:'||sqlerrm;
18 dbms_output.put_line(v_err_mess);
19 end;
20 /
0
inner layer values:0
PL/SQL procedure successfully completed
以上實驗
內層程式中發生異常後,不會繼續執行外層程式的語句。
可以在最外層進行異常處理。
通過以下實驗說明這種寫法的問題:
SQL> create table test_number(test_id number);
Table created
Executed in 0.031 seconds
不使用子程式,正常執行:
SQL> declare
2 v_err_mess varchar2(200);
3 n_count number;
4 begin
5 select count(1) into n_count from test_number;
6 dbms_output.put_line(n_count);
7 exception
8 when others then
9 v_err_mess:=sqlcode||' '||sqlerrm;
10 dbms_output.put_line(v_err_mess);
11 end;
12 /
0
PL/SQL procedure successfully completed
不使用子程式,異常執行:
SQL> declare
2 v_err_mess varchar2(200);
3 n_count number;
4 begin
5 select test_id into n_count from test_number;
6 dbms_output.put_line(n_count);
7 exception
8 when others then
9 v_err_mess:=sqlcode||' '||sqlerrm;
10 dbms_output.put_line(v_err_mess);
11 end;
12 /
100 ORA-01403: 未找到任何資料
PL/SQL procedure successfully completed
使用子程式,在子程式中進行異常處理:
可以看到,在外層呼叫中無法獲取子程式異常處理中的賦值
SQL>
SQL> declare
2 v_err_mess varchar2(200);
3 n_count number;
4 begin
5 begin
6 select test_id into n_count from test_number;
7 dbms_output.put_line(n_count);
8 exception
9 when others then
10 v_err_mess:=sqlcode||' '||sqlerrm;
11 dbms_output.put_line(v_err_mess);
12 end;
13
14 dbms_output.put_line('inner layer values:'||n_count);
15 exception
16 when others then
17 v_err_mess:='out_layer:'||sqlerrm;
18 dbms_output.put_line(v_err_mess);
19 end;
20 /
100 ORA-01403: 未找到任何資料
inner layer values:
PL/SQL procedure successfully completed
使用子程式,在子程式中進行正常處理:
可以看到,在外層呼叫中可以獲取子程式中的賦值
SQL> declare
2 v_err_mess varchar2(200);
3 n_count number;
4 begin
5 begin
6 select count(1) into n_count from test_number;
7 dbms_output.put_line(n_count);
8 exception
9 when others then
10 v_err_mess:=sqlcode||' '||sqlerrm;
11 dbms_output.put_line(v_err_mess);
12 end;
13
14 dbms_output.put_line('inner layer values:'||n_count);
15 exception
16 when others then
17 v_err_mess:='out_layer:'||sqlerrm;
18 dbms_output.put_line(v_err_mess);
19 end;
20 /
0
inner layer values:0
PL/SQL procedure successfully completed
以上實驗
內層程式中發生異常後,不會繼續執行外層程式的語句。
可以在最外層進行異常處理。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26451536/viewspace-1815947/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- java中異常丟擲後程式碼還會繼續執行嗎Java
- 程式碼中如果遇到未定義的變數,會丟擲異常嗎?程式還會不會繼續往下走?變數
- try...except 語句通常用於捕獲和處理可能在程式碼執行過程中發生的異常
- 程式執行異常: Modulo by zero
- php返回資料後如何讓程式繼續執行其它操作PHP
- Spring中JPA在異常後三種方法繼續事務Spring
- python:return之後的語句還會執行嗎Python
- SAP HUM事務程式碼HUMO裡顯示內層和外層HU資訊
- iOS底層原理 - 常駐執行緒iOS執行緒
- 【Java】面試官靈魂拷問:if語句執行完else語句真的不會再執行嗎?Java面試
- osi7層模型及執行緒和程式模型執行緒
- InterruptedException異常會對併發程式設計產生哪些影響?Exception程式設計
- 不同程式語言在發生stackoverflow之前支援的呼叫棧最大巢狀層數巢狀
- 執行程式時,程式返回TooManyResultsException異常行程OOMException
- 後臺執行SQL語句(oracle)SQLOracle
- 雲伺服器客戶端斷開後,如何保持程式繼續執行呢?伺服器客戶端
- Thread 中的 join() 方法的作用是呼叫執行緒等待該執行緒執行完後,再繼續執行thread執行緒
- 【財富空間】高層聚人心,中層善用人,基層重執行
- 全網最適合入門的物件導向程式設計教程:27 異常捕獲-Python中異常層級與自定義異常類的實現物件程式設計Python
- Jquery ajax載入等待執行結束再繼續執行下面程式碼操作jQuery
- shell:nohup (在系統後臺不掛起地執行命令,退出終端不會影響程式的執行)
- 程式執行多次後發生訊號量訪問失敗
- Jtti:MySQL 資料庫中update語句會不會發生死鎖JttiMySql資料庫
- Service 層異常拋到 Controller 層處理還是直接處理?Controller
- Java自定義異常的建立及多層呼叫Java
- Python的if語句多層巢狀怎麼使用Python巢狀
- 生產系統 SQL 執行異常原因分析SQL
- Java併發(五)執行緒池使用番外-分析RejectedExecutionException異常Java執行緒Exception
- finally語句在return執行之後,return返回之前執行
- try{}裡有一個return語句,那麼緊跟在這個try後的finally{}裡的code會不會被執行,什麼時候被執行?
- Java中各程式碼層級的關係Java
- await會阻塞其所在表示式中後續表示式的執行AI
- sql語句如何執行的SQL
- 執行緒剖析-助力定位程式碼層面高耗時問題執行緒
- Channel: flutter平臺層與執行層的雙向通訊Flutter
- 程式與執行緒的產生執行緒
- 行行AI直播:OpenAI管理層“爆炸”GPTs的故事還能繼續?OpenAIGPT
- Java for迴圈中語句執行的順序Java
- 多執行緒執行任務時,某個執行緒拋異常,如何讓程式立即退出執行緒