炫意html5
最早CSS3和HTML5移动技术网站之一

Oracle PL/SQL – 异常

简述

在本章中,我们将讨论 PL/SQL 中的异常。异常是程序执行期间的错误条件。PL/SQL 支持程序员使用EXCEPTION程序中的块,并对错误情况采取适当的措施。有两种类型的异常 –
  • 系统定义的异常
  • 用户定义的异常

异常处理的语法

异常处理的一般语法如下。在这里,您可以列出尽可能多的异常情况。默认异常将使用

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 block.

引发异常

每当出现任何内部数据库错误时,数据库服务器都会自动引发异常,但程序员可以使用以下命令显式引发异常 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 提供了许多预定义的异常,当程序违反任何数据库规则时会执行这些异常。例如,当 SELECT INTO 语句不返回任何行时,会引发预定义的异常 NO_DATA_FOUND。下表列出了一些重要的预定义异常 –
异常Oracle 错误代码描述
ACCESS_INTO_NULL06530-6530当一个空对象被自动分配一个值时,它会被引发。
CASE_NOT_FOUND06592-6592当没有选择 CASE 语句的 WHEN 子句中的任何选项,并且没有 ELSE 子句时,会引发它。
COLLECTION_IS_NULL06531-6531当程序尝试将 EXISTS 以外的集合方法应用于未初始化的嵌套表或变量时,或者程序尝试为未初始化的嵌套表或变量的元素赋值时,会引发此问题。
DUP_VAL_ON_INDEX00001-1当尝试将重复值存储在具有唯一索引的列中时会引发此问题。
INVALID_CURSOR01001-1001当尝试进行不允许的游标操作时会引发它,例如关闭未打开的游标。
INVALID_NUMBER01722-1722当字符串转换为数字失败时引发它,因为字符串不代表有效数字。
LOGIN_DENIED01017-1017当程序尝试使用无效的用户名或密码登录数据库时会引发此问题。
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当尝试将数字除以零时会引发此问题。

炫意HTML5 » Oracle PL/SQL – 异常

Java基础教程Android基础教程