語句執行過程中,由於各種原因使得語句不能正常執行,可能會造成更大錯誤或整個系統的崩潰,所以PS/SQL提供了異常(exception)著一處理的方法來防止此類情況的發生。在代碼運行的過程中無論何時發生錯誤,PL/SQL都能控製程序自動地轉向執行異常部分。 1.預定義異常 預定義異常是由於系統產生的。 ...
語句執行過程中,由於各種原因使得語句不能正常執行,可能會造成更大錯誤或整個系統的崩潰,所以PS/SQL提供了異常(exception)著一處理的方法來防止此類情況的發生。在代碼運行的過程中無論何時發生錯誤,PL/SQL都能控製程序自動地轉向執行異常部分。
1.預定義異常
預定義異常是由於系統產生的。例如出現0除,PL/SQL就會產生一個預定義的ZERO_DIVIDE異常。
--ZERO_DIVIDE異常。使用系統預定義的異常處理,使用該處理後,程式運行時系統就不會提示出現錯誤。 declare v_number1 number(3):=10; v_number2 number(3):=0; v_number3 number(3); begin v_number3:=v_number1/v_number2; DBMS_OUTPUT.PUT_LINE(v_number3); EXCEPTION when ZERO_DIVIDE then DBMS_OUTPUT.PUT_LINE('除數不能為0'); end;
輸出結果:DIVIDE ZERO
2.PL/SQL中常見的異常:
3.轉換的錯誤處理
declare v_number1 number(3); v_char char(5):='123c'; begin v_number1:=to_number(v_char); //將字元轉換成數字 DBMS_OUTPUT.PUT_LINE('轉換成功'); EXCEPTION when value_error then DBMS_OUTPUT.PUT_LINE('轉換沒成功'); end;
4.聯合的錯誤處理
declare v_name school_students.stu_name%type; begin select stu_name into v_name from school_students where stu_id='2016322180021'; dbms_output.put_line(v_name); EXCEPTION when no_data_found then dbms_output.put_line('沒有數據'); when too_many_rows then dbms_output.put_line('數據太多'); when ZERO_DIVIDE then dbms_output.put_line('列出錯列'); end;
5.用戶定義異常
--用戶可以通過自定義異常來處理髮生的錯誤,語法格式為: exception when 異常名 then 語句塊 1; when then 語句塊2; [when others then 語句塊3;] end;
註意:每個異常處理部分都是由when子句和相應的執行語句組成
6.自定義異常
declare e_name exception; v_num number(8); begin select count(*) into v_num from school_students; if v_num>10 then RAISE e_name; end if ; exception when e_name then dbms_output.put_line('最大值不能超過10'); end;
註意:同一個異常不允許多個when子句來處理,一個異常對應一個when子句。
7.使用others異常
declare v_name school_students.stu_name%type; begin select stu_name into v_name from school_students where stu_id='2016322180021'; dbms_output.put_line(v_name); EXCEPTION when OTHERS then dbms_output.put_line('出錯了'); end;
對於一個異常有兩個處理方式,分別位於不同的when子句,因此系統會認為是不合法的。可以使用others來處理那些不能由其他when子句處理的異常,others異常處理總是位於exception語句的最後。
其實,others異常處理可以藉助兩個函數來說明捕捉到的異常的類型,這兩個函數是PL/SQL和SQLERRM,其中SQLLOCODE是用來說明當前錯誤的代碼,如果是用戶自定義異常。則返回1.SQLERRM返回的是當前錯誤的信息。
8.空操作和空值
declare n number(3):=-1; begin if n<0 then null; else DBMS_OUTPUT.PUT_LINE('正常'); end if; end;