codecamp

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 当试图除以零若干它上升。

PL / SQL - 常量和文字
PL / SQL - 操作员
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }