標籤:
Oracle中PL/SQL的執行部分和異常部分
一.PL/SQL的執行部分。
指派陳述式分兩種,一種是定義一個變數,然後接收使用者的IO賦值;另一種是通過SQL查詢結果賦值。
使用者賦值舉例:
set serveroutput on;accept abc prompt ‘請輸入abc的值‘;DECLARE a int:= &abc;BEGIN dbms_output.put_line(a);END;
查詢賦值舉例:
set serveroutput on;DECLARE str varchar2(20);BEGIN select ename into str from emp where empno=‘7369‘; dbms_output.put_line(str);END;
PL/SQL的主要控制語句如下:
1.if...then elsif … then end if;
判斷if正確則執行then,否則執行else(elsif為嵌套判斷)
注意elsif,裡面少一下e.
2.Case var when … then when … then end
有邏輯的從數值中做出選擇
3.Loop exit end loop
迴圈控制,用判斷語句執行exit
4.Loop exit when … end loop
同上,當when為真時執行exit
5.while..loop end loop
當while為真時迴圈
6.for...in...loop end loop
已知迴圈次數的迴圈
因為流程式控制制比較多,在這裡就不一一舉執行個體了,寫幾個比較經典的程式給大家看一下。
********列印9*9乘法表*********
for in..loop
set serveroutput on;DECLARE i number; j number;BEGIN for i in 1..9 loop for j in 1..i loop dbms_output.put(i||‘*‘||j||‘=‘||(i*j)||‘ ‘); end loop; dbms_output.put_line(‘‘); end loop;END;
while loop
set serveroutput on;declare i number:=1; j number:=1;begin while i<10 loop while j<=i loop dbms_output.put(i||‘*‘||j||‘=‘||(i*j)||‘ ‘); j:=j+1; end loop; i:=i+1; j:=1; dbms_output.put_line(‘‘); end loop;end;
*********計算1+2+..+10的值*********
loop exit & loop exit when
set serveroutput on; declare i number:=1; i_sum number:=0;begin loop i_sum:=i_sum+i; i:=i+1; if i>10 then exit; end if; end loop; dbms_output.put(i_sum); dbms_output.put_line(‘‘); end;
注意:put只是把輸出結果放入緩衝區,直到遇到put_line時才會輸出。所以只有put的時候,不會顯示i_sum的結果。
可以把 if i>10 then exit; end if; 換成exit when i>10;這樣就成為了loop ..exit when .. end loop 結構。
*********輸入一個字元,判斷是字母、數字還是其他字元****************
if then elsif else
set serveroutput on;declare i_char varchar2(2); begin i_char:=&abc; if regexp_like(i_char,‘^[a-z]$‘) then dbms_output.put_line(‘輸入的是字母‘); elsif regexp_like(i_char,‘^[0-9]$‘) then dbms_output.put_line(‘輸入的是數字‘); else dbms_output.put_line(‘輸入的是其他字元‘); end if;end;
case when
set serveroutput on;declare i_char varchar2(2); i_result varchar2(30);begin i_char:=&abc; i_result:= case when regexp_like(i_char,‘^[a-z]$‘) then ‘輸入的是字母‘ when regexp_like(i_char,‘^[0-9]$‘) then ‘輸入的是數字‘ else ‘輸入的是其他字元‘ end; dbms_output.put_line(i_result);end;
注意:在提示視窗中輸入的時候,字串一定要加單引號,否則就會出錯,本人每次在這裡都要拌一下。
SQL語句就是資料庫查詢語句,比較簡單就不在這裡說了。
二.異常部分。
資料庫中的異常跟java中的異常的機制和作用原理是一樣的,只是代碼和格式不一樣,資料庫中的異常分為三類:系統異常(預定義異常)、自訂異常以及引發應用程式異常。
PL/SQL程式在運行過程中,可能會出現錯誤或異常現象
例如:無法建立到Oracle的串連或用0做除數。好的程式應該對可能發生的異常情況進行處理,異常處理代碼在EXCEPTION塊中實現
可以使用WHEN語句來定義異常。WHEN語句的使用方法如下:
EXCEPTION
WHEN <異常情況名> THEN
<異常處理代碼>
WHEN <異常情況名> THEN
<異常處理代碼>
...
WHEN OTHERS THEN
<異常處理代碼>
常見的系統異常
| 異常名稱 |
異常碼 |
說明 |
| NO_DATA_FOUND |
ORA-01403 |
select into語句中沒有返回任何記錄 |
| TOO_MANY_ROWS |
ORA-01422 |
select into語句中返回多行資料。 |
| ZERO_DIVDE |
ORA-01476 |
試圖用0作為除數。 |
| DUP_VAL_ON_INDEX |
ORA-00001 |
試圖向唯一索引列插入重複值 |
| INVALID_CURSOR |
ORA-01001 |
試圖進行非法遊標操作。 |
| CURSOR_ALREADY_OPEN |
ORA-06511 |
試圖開啟一個已經開啟的遊標。 |
| INVALID_NUMBER |
ORA-01722 |
試圖將數字轉換為字串。 |
| VALUE_ERROR |
|
在產生大小限制錯誤時出現。如,變數中的列值超出變數的大小 |
LOGIN_DENIED |
|
輸入的使用者名稱或者密碼無效時出現。 |
當與一個異常錯誤相關的錯誤出現時,就會隱含觸發該異常錯誤。使用者定義的異常錯誤是通過顯式使用 RAISE 語句來觸發。當引發一個異常錯誤時,控制就轉向到 EXCEPTION塊異常錯誤部分,執行錯誤處理代碼。
對於這類異常情況的處理,步驟如下:
在PL/SQL 塊的定義部分定義異常情況:
<異常名稱> exception;
在PL/SQL 塊的執行部分RAISE異常:
RAISE <異常名稱>;
在PL/SQL 塊的異常情況處理部分對異常情況做出相應的處理。
WHEN <異常名稱> THEN
代碼...
Oracle中PL/SQL的執行部分和各種流程式控制制