PL/SQL异常

 

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

  • 系统定义的异常

  • 用户定义的异常

异常处理语法

一般异常处理的语法如下。在这里可以列出下来很多,要处理异常。默认的异常将使用WHEN others THEN处理:

  1. DECLARE
  2. <declarations section>
  3. BEGIN
  4. <executable command(s)>
  5. EXCEPTION
  6. <exception handling goes here >
  7. WHEN exception1 THEN
  8. exception1-handling-statements
  9. WHEN exception2 THEN
  10. exception2-handling-statements
  11. WHEN exception3 THEN
  12. exception3-handling-statements
  13. ........
  14. WHEN others THEN
  15. exception3-handling-statements
  16. END;

示例

写一些简单的代码来说明这个概念。将使用我们已经创建,并在前面的章节中使用的CUSTOMERS表:

  1. DECLARE
  2. c_id customers.id%type := 8;
  3. c_name customers.name%type;
  4. c_addr customers.address%type;
  5. BEGIN
  6. SELECT name, address INTO c_name, c_addr
  7. FROM customers
  8. WHERE id = c_id;
  9.  
  10. DBMS_OUTPUT.PUT_LINE ('Name: '|| c_name);
  11. DBMS_OUTPUT.PUT_LINE ('Address: ' || c_addr);
  12. EXCEPTION
  13. WHEN no_data_found THEN
  14. dbms_output.put_line('No such customer!');
  15. WHEN others THEN
  16. dbms_output.put_line('Error!');
  17. END;
  18. /

当上述代码在SQL提示符执行时,它产生了以下结果:

  1. No such customer!
  2.  
  3. PL/SQL procedure successfully completed. 

上述程序显示一个客户的ID给出的名字和地址。由于在我们的数据库没有ID值为8的客户,该程序运行时引发一个异常NO_DATA_FOUND,这是捕获异常EXCEPTION块。

引发异常

异常是数据库服务器自动在内部数据库错误,但异常可以明确地提出由程序员使用命令RAISE。以下是引发异常的简单的语法:

  1. DECLARE
  2. exception_name EXCEPTION;
  3. BEGIN
  4. IF condition THEN
  5. RAISE exception_name;
  6. END IF;
  7. EXCEPTION
  8. WHEN exception_name THEN
  9. statement;
  10. END;

可以在引发Oracle的标准异常或任何用户定义的异常使用上述语法。下一节会显示如何引发用户定义异常,引发Oracle标准异常以及类似的方法的例子。

用户自定义异常

PL/SQL允许根据程序的需要定义自己的异常。用户定义的异常必须声明,然后明确地提出使用一个RAISE语句或程序DBMS_STANDARD.RAISE_APPLICATION_ERROR。

声明一个异常的语法是:

  1. DECLARE
  2. my-exception EXCEPTION;

示例:

下面的例子说明了这个概念。该程序需要一个客户ID,当用户输入了一个无效的ID,异常invalid_id引发。

  1. DECLARE
  2. c_id customers.id%type := &cc_id;
  3. c_name customers.name%type;
  4. c_addr customers.address%type;
  5.  
  6. -- user defined exception
  7. ex_invalid_id EXCEPTION;
  8. BEGIN
  9. IF c_id <= 0 THEN
  10. RAISE ex_invalid_id;
  11. ELSE
  12. SELECT name, address INTO c_name, c_addr
  13. FROM customers
  14. WHERE id = c_id;
  15.  
  16. DBMS_OUTPUT.PUT_LINE ('Name: '|| c_name);
  17. DBMS_OUTPUT.PUT_LINE ('Address: ' || c_addr);
  18. END IF;
  19. EXCEPTION
  20. WHEN ex_invalid_id THEN
  21. dbms_output.put_line('ID must be greater than zero!');
  22. WHEN no_data_found THEN
  23. dbms_output.put_line('No such customer!');
  24. WHEN others THEN
  25. dbms_output.put_line('Error!');
  26. END;
  27. /

当上述代码在SQL提示符执行时,它产生了以下结果:

  1. Enter value for cc_id: -6 (let's enter a value -6)
  2. old 2: c_id customers.id%type := &cc_id;
  3. new 2: c_id customers.id%type := -6;
  4. ID must be greater than zero!
  5.  
  6. 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. Egret(白鹭引擎)——Egret+fairyGui 实战项目入门

    前言 一行白鹭上青天 需求 最近,我们老板刷刷的为了省事,给美术减压(背景有点长,不说了). 美术出 fairygui,我需要在网页上看到实时操作,并且看到效果! 需求分析 这怕是要了我的狗命啊,但是 ...

  2. centos6 和centos7 安装git 的区别

    centos6 和centos7 安装git 的区别 centos6安装git yum install curl-devel expat-devel gettext-devel openssl-dev ...

  3. 网站遭受大量CC攻击后的应对策略

    上周开始我网站遭受了一大波CC攻击,到目前为止仍在继续,作为一个建站小白,我感觉压力好大,又有新的问题要挑战了! 服务器架设在腾讯云,CC攻击很凶猛,带宽瞬间占满,于是在腾讯云后台配置安全组关闭了80 ...

  4. 推荐一个MacOS苹果电脑系统解压缩软件

    废话少说,直入主题: 连接:https://www.keka.io/en/ 开源免费好用(个人觉得比betterzip好用哈),附一张这货的图标:

  5. PAT甲题题解-1106. Lowest Price in Supply Chain (25)-(dfs计算树的最小层数)

    统计树的最小层数以及位于该层数上的叶子节点个数即可. 代码里建树我用了邻接链表的存储方式——链式前向星,不了解的可以参考,非常好用: http://www.cnblogs.com/chenxiwenr ...

  6. SCRUM 12.16

    今天大家又聚在一起开了个小会. 我们的爬虫出现了一些问题.某些美团的网页无法爬取,现在正在努力工作中. 关于用户统计的功能我们的以部分成员依然在完善中,17.18号应该基本能够推出. 成员 任务 彭林 ...

  7. 《Linux内核设计与实现》第四章学习笔记——进程调度

                                                                        <Linux内核设计与实现>第四章学习笔记——进程调 ...

  8. 20135202闫佳歆--week3 课本1-2章学习笔记

    第一章 Linux内核简介 一.Unix Unix是一个强大.健壮和稳定的操作系统. 简洁 绝大部分东西都被当做文件对待.这种抽象使对数据和对设备的操作都是通过一套相同的系统调用借口来进行的:open ...

  9. LINUX内核分析第四周学习总结——扒开系统调用的“三层皮”

    LINUX内核分析第四周学习总结--扒开系统调用的"三层皮" 标签(空格分隔): 20135321余佳源 余佳源 原创作品转载请注明出处 <Linux内核分析>MOOC ...

  10. 重温jsp①

    Jsp就是一个servlet servlet的缺点 不适合设置html响应体,需要response.Getwriter.print(); 优点:动态资源,可以编程. Jsp:在原有的html中加入了J ...