內層程式中發生異常後,不會繼續執行外層程式的語句
開發寫了個儲存過程需要我們審批,發現子程式中使用了異常處理語句,
通過以下實驗說明這種寫法的問題:
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
- 如何讓procedure儲存過程中的異常程式碼不中斷繼續執行儲存過程
- try...except 語句通常用於捕獲和處理可能在程式碼執行過程中發生的異常
- 程式執行異常: Modulo by zero
- Windows批處理 呼叫程式後 不等待子程式 父程式繼續執行命令Windows
- C++程式丟擲異常後執行順序C++
- jquery div為巢狀,更改了外層,不會改裡層jQuery巢狀
- php返回資料後如何讓程式繼續執行其它操作PHP
- java中異常處理finally和return語句的執行順序Java
- Java的內層類和外層類(轉)Java
- Spring中JPA在異常後三種方法繼續事務Spring
- SAP HUM事務程式碼HUMO裡顯示內層和外層HU資訊
- 一段良好的程式永遠不應該發生panic異常
- 瀏覽器退出之後php還會繼續執行麼?瀏覽器PHP
- iOS底層原理 - 常駐執行緒iOS執行緒
- python:return之後的語句還會執行嗎Python
- 【Java】面試官靈魂拷問:if語句執行完else語句真的不會再執行嗎?Java面試
- InterruptedException異常會對併發程式設計產生哪些影響?Exception程式設計
- 不同程式語言在發生stackoverflow之前支援的呼叫棧最大巢狀層數巢狀
- osi7層模型及執行緒和程式模型執行緒
- 執行SQL語句查詢時出現一個SQLException異常SQLException
- 【財富空間】高層聚人心,中層善用人,基層重執行
- exit() 時或之後還能繼續執行php程式碼的幾種辦法PHP
- 解決異常:公共語言執行時檢測到無效的程式
- 雲伺服器客戶端斷開後,如何保持程式繼續執行呢?伺服器客戶端
- 後臺執行SQL語句(oracle)SQLOracle
- oracle 中如何顯示sql語句的執行時間和sql語句的執行後的當前時間OracleSQL
- Thread 中的 join() 方法的作用是呼叫執行緒等待該執行緒執行完後,再繼續執行thread執行緒
- Discuz外掛安裝出現對不起,您安裝的不是正版應用,安裝程式無法繼續執行
- 當主執行緒崩潰而其它執行緒繼續執行時發生什麼(2)(轉)執行緒
- 當主執行緒崩潰而其它執行緒繼續執行時發生什麼(1)(轉)執行緒
- 追蹤應用程式所執行的sql語句SQL
- 在ASP程式中執行SQL語句的安全性問題 (轉)SQL
- 繼續瞭解Oracle部分後臺程式Oracle
- 快速定位sql語句執行內容SQL
- shell:nohup (在系統後臺不掛起地執行命令,退出終端不會影響程式的執行)
- 程式執行多次後發生訊號量訪問失敗
- 讓dede執行php程式碼和mysql語句PHPMySql