PL / SQL异常
程序执行过程中的错误情况被称为PL / SQL异常。 PL / SQL支持程序员在程序中使用异常块捕获这样的条件和适当的采取行动反对错误条件。有两种类型的异常:
系统定义异常
用户定义的异常
语法异常处理
一般语法异常处理如下。在这里,你可以列出下跌多达你想处理异常。默认的异常将使用别人的时候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;
您可以在提高甲骨文的标准异常或任何用户定义的异常使用上述语法。下一节会给你提高用户定义的异常,可以提高甲骨文标准异常以及类似的方法的例子。
用户定义的例外
PL / SQL允许您根据需要你的程序中定义自己的异常。用户定义的异常必须声明,然后提出了明确,使用一个RAISE语句或程序DBMS_STANDARD.RAISE_APPLICATION_ERROR。
宣告一个异常的语法是:
DECLARE my-exception EXCEPTION;
例:
下面的例子说明了这个概念。这个方案要求一个客户编号,当用户输入了一个无效的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提供了许多预先定义的异常,当任何数据库规则由程序违反了哪些被执行。例如,当一个SELECT INTO语句不返回行预定义异常NO_DATA_FOUND引发。下表列出了一些重要的预先定义的例外:
| 例外 | Oracle错误 | SQLCODE | 描述 |
|---|---|---|---|
| ACCESS_INTO_NULL | 06530 | -6530 | 当一个空对象被自动分配一个值,复活。 |
| CASE_NOT_FOUND | 06592 | -6592 | 当选定一个CASE语句的WHERE子句没有选择在当它发生了,并且没有ELSE子句。 |
| COLLECTION_IS_NULL | 06531 | -6531 | 当程序试图申请其他收集方法不是存在未初始化的嵌套表或VARRAY,或程序试图将值分配给未初始化的嵌套表或变长数组中的元素,复活。 |
| DUP_VAL_ON_INDEX | 00001 | -1 | 当试图重复值要被存储在具有唯一索引列它上升。 |
| INVALID_CURSOR | 01001 | -1001 | 当作出努力,使这是不允许的,如关闭一个未打开的游标的游标操作,复活。 |
| 无效号码 | 01722 | -1722 | 因为该字符串不表示一个有效的数,当一个字符串转换成一个数失败它被抬起。 |
| LOGIN_DENIED | 01017 | -1017 | 当s程序试图登录到数据库的使用无效的用户名或密码,这是提高。 |
| 没有找到数据 | 01403 | +100 | 当SELECT INTO语句不返回行,复活。 |
| NOT_LOGGED_ON | 01012 | -1012 | 当一个数据库呼叫没有被连接到该数据库发出它被抬起。 |
| PROGRAM_ERROR | 06501 | -6501 | 当PL / SQL有内部问题,复活。 |
| ROWTYPE_MISMATCH | 06504 | -6504 | 当光标在有不兼容的数据类型的变量取值,复活。 |
| SELF_IS_NULL | 30625 | -30625 | 被调用的成员方法,当它被升高,但是未初始化对象类型的实例。 |
| 的Storage_Error | 06500 | -6500 | 当PL / SQL内存不足或内存已损坏,复活。 |
| TOO_MANY_ROWS | 01422 | -1422 | 当s SELECT INTO语句返回多行,复活。 |
| VALUE_ERROR | 06502 | -6502 | 当发生算术,转换,截短,或大小约束误差它被抬起。 |
| ZERO_DIVIDE | 01476 | 1476 | 当试图除以零若干它上升。 |