程序執行過程中出現錯誤情況被稱為在PL/SQL異常。 PL/SQL支持程序員在程序中使用異常塊捕獲這樣的條件並采取適當的動作應對錯誤情況。有兩種類型的異常:
系統定義的異常
用戶定義的異常
一般異常處理的語法如下。在這裡可以列出下來很多,要處理異常。默認的異常將使用WHEN others THEN處理:
DECLARE
<declarations section>
BEGIN
<executable command(s)>
EXCEPTION
<exception handling goes here >
WHEN exception1 THEN
exception1-handling-statements
WHEN exception2 THEN
exception2-handling-statements
WHEN exception3 THEN
exception3-handling-statements
........
WHEN others THEN
exception3-handling-statements
END;
寫一些簡單的代碼來說明這個概念。將使用我們已經創建,並在前面的章節中使用的CUSTOMERS表:
DECLARE
c_id customers.id%type := 8;
c_name customers.name%type;
c_addr customers.address%type;
BEGIN
SELECT name, address INTO c_name, c_addr
FROM customers
WHERE id = c_id;
DBMS_OUTPUT.PUT_LINE ('Name: '|| c_name);
DBMS_OUTPUT.PUT_LINE ('Address: ' || c_addr);
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('No such customer!');
WHEN others THEN
dbms_output.put_line('Error!');
END;
/
當上述代碼在SQL提示符執行時,它產生了以下結果:
No such customer! PL/SQL procedure successfully completed.
上述程序顯示一個客戶的ID給出的名字和地址。由於在我們的數據庫沒有ID值為8的客戶,該程序運行時引發一個異常NO_DATA_FOUND,這是捕獲異常EXCEPTION塊。
異常是數據庫服務器自動在內部數據庫錯誤,但異常可以明確地提出由程序員使用命令RAISE。以下是引發異常的簡單的語法:
DECLARE
exception_name EXCEPTION;
BEGIN
IF condition THEN
RAISE exception_name;
END IF;
EXCEPTION
WHEN exception_name THEN
statement;
END;
可以在引發Oracle的標准異常或任何用戶定義的異常使用上述語法。下一節會顯示如何引發用戶定義異常,引發Oracle標准異常以及類似的方法的例子。
PL/SQL允許根據程序的需要定義自己的異常。用戶定義的異常必須聲明,然後明確地提出使用一個RAISE語句或程序DBMS_STANDARD.RAISE_APPLICATION_ERROR。
聲明一個異常的語法是:
DECLARE my-exception EXCEPTION;
下面的例子說明了這個概念。該程序需要一個客戶ID,當用戶輸入了一個無效的ID,異常invalid_id引發。
DECLARE
c_id customers.id%type := &cc_id;
c_name customers.name%type;
c_addr customers.address%type;
-- user defined exception
ex_invalid_id EXCEPTION;
BEGIN
IF c_id <= 0 THEN
RAISE ex_invalid_id;
ELSE
SELECT name, address INTO c_name, c_addr
FROM customers
WHERE id = c_id;
DBMS_OUTPUT.PUT_LINE ('Name: '|| c_name);
DBMS_OUTPUT.PUT_LINE ('Address: ' || c_addr);
END IF;
EXCEPTION
WHEN ex_invalid_id THEN
dbms_output.put_line('ID must be greater than zero!');
WHEN no_data_found THEN
dbms_output.put_line('No such customer!');
WHEN others THEN
dbms_output.put_line('Error!');
END;
/
當上述代碼在SQL提示符執行時,它產生了以下結果:
Enter value for cc_id: -6 (let's enter a value -6) old 2: c_id customers.id%type := &cc_id; new 2: c_id customers.id%type := -6; ID must be greater than zero! PL/SQL procedure successfully completed.
PL/SQL提供許多預先定義的異常,這是在被執行時的任何數據庫規則由程序引發。例如,預定義異常NO_DATA_FOUND時引發一個SELECT INTO語句返回數據行。下表列出了一些重要的預先定義的異常: