PL/SQL异常

 

程序执行过程中出现错误情况被称为在PL/SQL异常。 PL/SQL支持程序员在程序中使用异常块捕获这样的条件并采取适当的动作应对错误情况。有两种类型的异常:

  • 系统定义的异常

  • 用户定义的异常

异常处理语法

一般异常处理的语法如下。在这里可以列出下来很多,要处理异常。默认的异常将使用WHEN others 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;

可以在引发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提供许多预先定义的异常,这是在被执行时的任何数据库规则由程序引发。例如,预定义异常NO_DATA_FOUND时引发一个SELECT INTO语句返回数据行。下表列出了一些重要的预先定义的异常:

Exception Oracle Error SQLCODE 描述
ACCESS_INTO_NULL 06530 -6530 当一个空对象会自动分配一个值引发此异常
CASE_NOT_FOUND 06592 -6592 当没有任何选择,在当选择一个CASE语句的子句,并且没有ELSE子句时被引发
COLLECTION_IS_NULL 06531 -6531 当程序试图申请其他收集方法不是存在未初始化的嵌套表或VARRAY,或程序试图值分配给未初始化的嵌套表或变长数组的元素时被引发
DUP_VAL_ON_INDEX 00001 -1 当重复值试图被存储在具有唯一索引的列时被引发
INVALID_CURSOR 01001 -1001 当尝试以使这是不允许的,如关闭一个未打开的游标的游标操作时被引发
INVALID_NUMBER 01722 -1722 当一个字符的字符串转换成一个数失败,因为字符串不表示一个有效的数据被引发
LOGIN_DENIED 01017 -1017 当程序试图登录到数据库使用无效的用户名或密码被引发
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 它被引发当一个数试图除以零。

SQL记录-PLSQL异常的更多相关文章

  1. SQL记录-PLSQL记录

    PL/SQL记录   PL/SQL记录就是可以容纳不同类型的数据项的数据结构.记录由不同字段,类似于数据库表的行. 例如,要保留跟踪图书馆中的书籍.可能要跟踪有关每本书下面的属性类似:标题,作者,主题 ...

  2. SQL记录-PLSQL基本语法与数据类型

    PL/SQL基本语法 PL/SQL是一种块结构的语言,这意味着PL/SQL程序被划分和编写代码的逻辑块.每块由三个子部分组成: S.N. 段和说明 1 声明 此部分开头使用关键字DECLARE.它是一 ...

  3. SQL记录-PLSQL包

    PL/SQL包 PL/SQL包是组逻辑相关的PL/SQL类型,变量和子程序模式对象. 程序包将有两个强制性的部分: 包装规范定义 包体或定义 包装规范定义 规范是接口到包.它只是声明的类型,变量,常量 ...

  4. SQL记录-PLSQL游标

    PL/SQL游标 Oracle会创建一个存储区域,被称为上下文区域,用于处理SQL语句,其中包含需要处理的语句,例如所有的信息,行数处理,等等. 游标是指向这一上下文的区域. PL/SQL通过控制光标 ...

  5. SQL记录-PLSQL过程

    PL/SQL过程   子程序是一个程序单元/模块执行特定的任务.这些子程序被组合以形成更大的程序.这基本上是被称为“模块化设计”.子程序可以调用由另一个子程序或程序被称为调用程序. 子程序可以创建: ...

  6. SQL记录-PLSQL循环

    PL/SQL循环   可能有一种情况,当需要执行的代码块的几个多次.在一般情况下,语句顺序执行:一个函数的第一条语句,首先执行,然后是第二个...等等. 编程语言提供了各种控制结构,允许更多复杂的执行 ...

  7. SQL记录-PLSQL条件控制

    PL/SQL条件控制   决策结构需要程序员指定一个或多个条件要计算,或由程序进行测试,如果条件被确定为真那么一条或多条语句被执行,如果要被执行的其它语句条件被确定为假,则选其它执行块. 以下是从在大 ...

  8. SQL记录-PLSQL变量与常量文字

    PL/SQL变量   变量是只不过是一个给定的存储区域,程序可以操纵的名称.PL/SQL每个变量具有一个特定的数据类型,它决定了大小和变量的存储器的值,可以说存储器和设置操作可以施加到可变内被存储的范 ...

  9. SQL记录-PLSQL集合

    PL/SQL集合 集合是一个有序组具有相同的数据类型的元素.每个元素进行标识的唯一标表示其在集合中的位置. PL/SQL提供了三种集合类型: 索引表或关联数组 嵌套表 可变大小的数组或变长数组 Ora ...

随机推荐

  1. jenkins+maven+svn+npm自动发布部署实践

    一.系统版本centos7.6 二.根据jenkins官方安装方法yum安装jenkins 1.进入jenkins官网下载页面https://jenkins.io/download/,选择Red Ha ...

  2. WebShell代码分析溯源(第1题)

    <?php $POST['POST']='assert';$array[]=$POST;$array[0]['POST']($_POST['assert']);?> assert,是php ...

  3. [咸恩静][Real Love]

    歌词来源:http://music.163.com/#/song?id=484056972 作曲 : Andrew 崔/Brian Cho/220 [作曲 : Andrew 崔/Brian Cho/2 ...

  4. VC++ 屏蔽掉警告

    使用VC6.0在开发程序的时候经常会遇到很多警告,很麻烦,也很耽误时间,可以使用如下方法屏蔽掉警告 在StdAfx.h 中 #define VC_EXTRALEAN 下面增加:#pragma warn ...

  5. alpha发布排序结果

    友组所做排序 其中有一组是教师排序. 序号 组名 组长 项目简称 匿名1组 匿名2组 匿名3组 匿名4组 匿名5组 匿名6组 匿名7组 匿名8组 平均 1 新蜂 武志远 俄罗斯 2 3 3 4 4 5 ...

  6. 《Linux内核设计与实现》第五章读书笔记

    第五章  系统调用 5.1与内核通信 1. 系统调用 让应用程序受限的访问硬件设备 提供创建新进程并与已有进程通信的机制 提供申请操作系统其他资源能力是用户空间进程和硬件设备之间的中间层 2. 系统调 ...

  7. # 蜗牛慢慢爬 LeetCode 21. Merge Two Sorted Lists [Difficulty: Easy]

    题目 Merge two sorted linked lists and return it as a new list. The new list should be made by splicin ...

  8. Beta冲刺——day7

    Beta冲刺--day7 作业链接 Beta冲刺随笔集 github地址 团队成员 031602636 许舒玲(队长) 031602237 吴杰婷 031602220 雷博浩 031602134 王龙 ...

  9. final发布评论Ⅱ

    奋斗吧兄弟:奋斗吧兄弟团队提供了草原.水域.田地三种环境可以进行选择.功能如下:添加自定义生物功能可以增加生物种类,但是无法设置捕食关系,这里希望想办法完善.生物除了图片方式以外,还可以以文字的方式展 ...

  10. 在ubuntu下运行python脚本

    转自http://www.cnblogs.com/hester/p/5575658.html 1. 运行方式一 新建test.py文件: 1 touch test.py 然后vim test.py打开 ...