PL-SQL异常

本文概要

  • 什么是异常
  • PL / SQL异常处理
  • 异常处理实例
  • 引发异常
  • PL / SQL用户定义的例外
  • 预先定义的PL / SQL异常
什么是异常【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名称年龄地址薪水
1Ramesh 23 Allahabad20000
2Suresh22坎普尔22000
3马赫什24Ghaziabad24000
4Chandan25Noida26000
Alex21巴黎28000
6苏尼塔20Delhi30000
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_NULL06530-6530当一个空对象被自动赋值时,它将被触发。
CASE_NOT_FOUND06592-6592如果没有选择CASE语句的“when”子句中的任何选项,并且没有else子句,则会引发该问题。
COLLECTION_IS_NULL06531-6531当一个程序尝试应用其他采集方法比存在于一个未初始化的嵌套表或VARRAY,或者程序尝试分配值,以一个未初始化的嵌套表或VARRAY的元素它被抬起。
DUP_VAL_ON_INDEX00001-1当试图将重复的值存储在具有唯一索引的列中时,将引发此问题。
INVALID_CURSOR01001-1001当尝试执行不允许的游标操作时,例如关闭未打开的游标,将引发此问题。
无效号码01722-1722因为字符串不代表有效的数字时的字符串转换成一个号码失败,复活。
LOGIN_DENIED01017-1017当s程序试图使用无效的用户名或密码登录到数据库时,将引发此问题。
NO_DATA_FOUND01403+100当select into语句不返回任何行时,将引发此问题。
NOT_LOGGED_ON01012-1012当数据库呼叫,而无需连接到数据库发出它上升。
PROGRAM_ERROR06501-6501当PL/SQL有内部问题时,会引发此问题。
ROWTYPE_MISMATCH06504-6504当游标在具有不兼容数据类型的变量中获取值时,将引发此问题。
SELF_IS_NULL30625-30625时调用的成员方法,当它被升高,但是未初始化的对象类型的实例。
STORAGE_ERROR06500-6500当PL/SQL耗尽内存或内存损坏时,将引发此问题。
TOO_MANY_ROWS01422-1422当SELECT INTO语句返回多个行时引发。
VALUE_ERROR06502-6502当出现算术,转换,截短,或大小约束错误时被触发。
ZERO_DIVIDE014761476当尝试将一个数字除以0时,它被触发。

    推荐阅读