本文概要
- 什么是异常
- PL / SQL异常处理
- 异常处理实例
- 引发异常
- PL / SQL用户定义的例外
- 预先定义的PL / SQL异常
PL / SQL功能有助于程序员赶上使用在程序异常块和采取适当的行动对错误条件这样的条件。
有两种类型的例外:
- 系统定义的例外
- 用户定义的例外
下面是异常处理的一般语法:
DECLARE
<
declarations section>
BEGIN
<
executable command(s)>
EXCEPTION
<
exception handling goes here >
WHEN exception1 THEN
exception1-handling-statements
WHEN exception2THEN
exception2-handling-statements
WHEN exception3 THEN
exception3-handling-statements
........
WHEN others THEN
exception3-handling-statements
END;
异常处理实例让我们举一个简单的例子来演示异常处理的概念。在这里,我们使用的是已经创建CUSTOMERS表。
SELECT * FROM COUSTOMERS;
ID | 名称 | 年龄 | 地址 | 薪水 |
---|---|---|---|---|
1 | Ramesh | 23 | Allahabad | 20000 |
2 | Suresh | 22 | 坎普尔 | 22000 |
3 | 马赫什 | 24 | Ghaziabad | 24000 |
4 | Chandan | 25 | Noida | 26000 |
五 | Alex | 21 | 巴黎 | 28000 |
6 | 苏尼塔 | 20 | Delhi | 30000 |
DECLARE
c_id customers.id%type := 8;
c_namecustomers.name%type;
c_addr customers.address%type;
BEGIN
SELECTname,address INTOc_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,这是在异常的代码块捕获。
注意:你得到的结果“没有这样的客户”,因为在上面的例子中使用的CUSTOMER_ID是8和存在价值不具有CUTOMER ID 8在该表中。如果使用(即1?6)在上表中所定义的ID,将得到一个确定的结果。对于演示的例子:在这里,我们使用的是ID为5。
DECLARE
c_id customers.id%type := 5;
c_namecustomers.name%type;
c_addr customers.address%type;
BEGIN
SELECTname,address INTOc_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提示符下执行后,你会得到以下结果:
Name: alex
Address: paris
PL/SQL procedure successfully completed.
引发异常在任何内部数据库错误的情况下,异常是由数据库服务器会自动升起。但它也可以明确地程序员使用命令RAISE提高。
语法引发异常:
DECLARE
exception_name EXCEPTION;
BEGIN
IF condition THEN
RAISE exception_name;
END IF;
EXCEPTION
WHEN exception_name THEN
statement;
END;
PL / SQL用户定义的例外PL / SQL有利于他们的用户可根据需要程序来定义自己的异常。用户定义的异常可以明确地使用一个RAISE语句或过程DBMS_STANDARD.RAISE_APPLICATION_ERROR被升高。
语法用户定义例外
DECLARE
my-exception EXCEPTION;
预先定义的PL / SQL异常有在PL / SQL许多预先定义的异常,当任何数据库的规则是由程序违反了哪些被执行。
例如:NO_DATA_FOUND是一个预先定义的异常,当SELECT INTO语句不返回行被上调。
以下是一些重要的预先定义的例外列表:
例外 | Oracle错误 | SQL代码 | 描述 |
---|---|---|---|
ACCESS_INTO_NULL | 06530 | -6530 | 当一个空对象被自动赋值时,它将被触发。 |
CASE_NOT_FOUND | 06592 | -6592 | 如果没有选择CASE语句的“when”子句中的任何选项,并且没有else子句,则会引发该问题。 |
COLLECTION_IS_NULL | 06531 | -6531 | 当一个程序尝试应用其他采集方法比存在于一个未初始化的嵌套表或VARRAY,或者程序尝试分配值,以一个未初始化的嵌套表或VARRAY的元素它被抬起。 |
DUP_VAL_ON_INDEX | 00001 | -1 | 当试图将重复的值存储在具有唯一索引的列中时,将引发此问题。 |
INVALID_CURSOR | 01001 | -1001 | 当尝试执行不允许的游标操作时,例如关闭未打开的游标,将引发此问题。 |
无效号码 | 01722 | -1722 | 因为字符串不代表有效的数字时的字符串转换成一个号码失败,复活。 |
LOGIN_DENIED | 01017 | -1017 | 当s程序试图使用无效的用户名或密码登录到数据库时,将引发此问题。 |
NO_DATA_FOUND | 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 | 当SELECT INTO语句返回多个行时引发。 |
VALUE_ERROR | 06502 | -6502 | 当出现算术,转换,截短,或大小约束错误时被触发。 |
ZERO_DIVIDE | 01476 | 1476 | 当尝试将一个数字除以0时,它被触发。 |
推荐阅读
- PL-SQL触发器
- PL-SQL函数
- PL-SQL游标
- PL-SQL存储过程
- PL-SQL GOTO语句
- PL-SQL Continue语句
- PL-SQL For循环
- PL-SQL While循环
- PL-SQL循环语句