在pl/sql的执行过程中发生异常时系统所作的处理称为一个例外情况(exception)。通常例外情况的种类有三种:

1、预定义的oracle例外情况oracle预定义的例外情况大约有24个,对于这种例外情况无需在程序中定义,由oracle自动地触发(重点)

2、非预定义的oracle例外情况由使用者增加定义例外情况,然后oracle自动将其触发执行。

3、自定义例外,这个用的较少。

自定义例外的基本语法:

exception

when <异常情况名> then

<异常处理代码>

when <异常情况名> then

<异常处理代码>

...

when others then

<异常处理代码>

捕获异常的两个目的:

1、给用户提示更加明确,方便对过程优化;

2、可能需要对异常进行业务处理。

例外传递

如果不处理例外我们看看会出现什么情况

案例:编写一个过程,可接收雇员的编号,并显示该雇员的姓名。

问题是,如果输入的雇员编号不存在,怎样去处理呢?

create or replace procedure inempno_listename(v_in_empno number) is

v_ename emp.ename%type;

begin

select ename into v_ename from emp where empno=v_in_empno;

exception

when no_data_found then

dbms_output.put_line('你输入的雇员编号不存在!');

when others then

dbms_output.put_line('错误不明!');

end;

常用的预定义的例外

oracle预定之例外情况的处理,下列出常见的几个:

例外情况

错误代码

NO_DATA_FOUND

ORA-01403

TOO_MANY_ROWS

ORA-01427

INVALID_CURSOR

ORA-01001

VALUE_ERROR

ORA-06502

INVALID_NUMBER

ORA-01722

ZERO_DIVIDE

ORA-01476

DUP_VAL_ON_INDEX ORA-00001

试图向具有唯一键值的索引中插入一个重复键值。

CASE_NOT_FOUND

ORA-06592

CURSOR_NOT_OPEN ORA-06511

游标没有打开

预定义说明的部分ORACLE异常错误

错误号

异常错误信息名称

说明

ORA-0001

Dup_val_on_index

违反了唯一性限制

ORA-0051

Timeout-on-resource

在等待资源时发生超时

ORA-0061

Transaction-backed-out

由于发生死锁事务被撤消

ORA-1001

Invalid-CURSOR

试图使用一个无效的游标

ORA-1012

Not-logged-on

没有连接到ORACLE

ORA-1017

Login-denied

无效的用户名/口令

ORA-1403

No_data_found

SELECT INTO没有找到数据

ORA-1422

Too_many_rows

SELECT INTO 返回多行

ORA-1476

Zero-divide

试图被零除

ORA-1722

Invalid-NUMBER

转换一个数字失败

ORA-6500

Storage-error

内存不够引发的内部错误

ORA-6501

Program-error

内部错误

ORA-6502

Value-error

转换或截断错误

ORA-6504

Rowtype-mismatch

宿主游标变量与 PL/SQL变量有不兼容行类型

ORA-6511

CURSOR-already-OPEN

试图打开一个已处于打开状态的游标

ORA-6530

Access-INTO-null

试图为null 对象的属性赋值

ORA-6531

Collection-is-null

试图将Exists 以外的集合( collection)方法应用于一个null pl/sql 表上或varray上

ORA-6532

Subscript-outside-limit

对嵌套或varray索引得引用超出声明范围以外

ORA-6533

Subscript-beyond-count

对嵌套或varray 索引得引用大于集合中元素的个数.

pl/sql进阶--例外处理

预定义例外case_not_found

在开发pl/sql块中编写case语句时,如果在when子句中没有包含必须的条件分支,就会触发case_not_found的例外。

预定义例外zero_divide

当执行2/0语句时,则会触发该例外。

预定义例外no_data_found

下面是一个pl/sql块,当执行select into 没有返回行,就会被触发该例外。

预定义例外too_many_rows

当执行select into语句时,如果返回超过了一行,则会触发该例外。

案例:

--cast_not_found案例

create or replace procedure sp_pro6(spno number) is

v_sal emp.sal%type;

begin

select sal into v_sal from emp where empno=spno;

case

when v_sal<1000 then

update emp set sal=sal+100 where empno=spno;

when v_sal<2000 then

update emp set sal=sal+200 where empno=spno;

end case;

exception

when case_not_found then

dbms_output.put_line('case语句没有与'||v_sal||'相匹配的条件');

end;

--no_data_found案例

declare

v_sal emp.sal%type;

begin

select sal into v_sal from emp

where ename='&name';

exception

when no_data_found then

dbms_output.put_line('不存在该员工');

end;

--too_many_rows错误案例

declare

v_ename emp.ename%type;

begin

select ename into v_ename from emp;

exception

when too_many_rows then

dbms_output.put_line('返回了多行');

end;

如何处理多个例外:

set serveroutput on;

declare

var_name varchar(60);

begin

select ename into var_name from emp

where deptno=&deptno;

exception

when no_data_found then

dbms_output.put_line('没有匹配数据!');

when too_many_rows then

dbms_output.put_line('返回多行数据!');

when others then

dbms_output.put_line('提示错误不明!');

end;

pl/sql进阶--例外处理的更多相关文章

  1. pl/sql进阶——例外处理

    在pl/sql的执行过程中发生异常时系统所作的处理称为一个例外情况(exception).通常例外情况的种类有三种: ①预定义的oracle例外情况,oracle预定义的例外情况大约有24个,对于这种 ...

  2. pl/sql进阶一控制结构

    在任何计算机语言(c,java,c#,c++)都有各种控制语句(条件语句,循环结构,顺序控制结构…),在pl/sql中也存在这样的控制结构. 在本部分学校完毕后,希望大家达到: 1)使用各种if语句 ...

  3. 二十五、oracle pl/sql进阶--控制结构(分支,循环,控制)

    一.pl/sql的进阶--控制结构在任何计算机语言(c,java,pascal)都有各种控制语句(条件语句,循环结构,顺序控制结构...),在pl/sql中也存在这样的控制结构.在本部分学习完成后,希 ...

  4. Oracle实战笔记(第七天)之PL/SQL进阶

    一.控制结构 控制结构包括:判断语句(条件分支语句).循环语句.顺序控制语句三种. 1.条件分支语句 if--then:简单条件判断 --编写一个过程,可以输入一个雇员名,如果该雇员名的工资低于200 ...

  5. Oracle数据库—— PL/SQL进阶编程

    一.涉及内容 1.掌握PL/SQL程序块的结构 2.理解并熟练掌握各种变量的应用. 二.具体操作 1.创建一个表messages,该表只有一个字段results 类型是number(2),编写一个块, ...

  6. Oracle基础(五)pl/sql进阶(分页过程)

    编写分页过程         通过pl/sql实现分页过程,再该过程中由简单到难一步步深入,目的在于通过该案例熟悉pl/sql的各种存储过程,包,游标.怎样在java中调用等内容的学习. 1.无返回值 ...

  7. Oracle PL/SQL随堂笔记总结

    1.pl/sql编程 2.存储过程 3.函数 4.触发器 5.包 6.pl/sql基础 -定义并使用变量 7.pl/sql的进阶 8.oracle的视图 1.pl/sql编程 1.理解oracle的p ...

  8. pl/sql的介绍

    为什么需要pl/sql编程? 因为使用纯的sql语句来操作数据库,有先天性的技术缺陷: 1.不能模块编程: 2.执行速度慢: 3.安全性有问题: 4.浪费带宽. pl/sql是什么? pl/sql(p ...

  9. Oracle基础(四)pl/sql

    PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL). PL/SQL是Oracle数据库对SQL语句的扩展.在普通SQL语句的使用上添加了编程语言的特点 ...

随机推荐

  1. JavaScript获取当前值

    JavaScript获取当前值 1.说明        获取select下拉框中的选中的值以及文本值 2.实现源码 <!DOCTYPE html PUBLIC "-//W3C//DTD ...

  2. Flex实现双轴条状图

    1.问题背景 一般的,柱状图可以实现双轴图,但是如何实现双轴条状图? 2.实现实例 <?xml version="1.0" encoding="utf-8" ...

  3. [NOIP2017] 逛公园

    [NOIP2017] 逛公园 题目大意: 给定一张图,询问长度 不超过1到n的最短路长度加k 的1到n的路径 有多少条. 数据范围: 点数\(n \le 10^5\) ,边数\(m \le 2*10^ ...

  4. 【Luogu1879】玉米田(状态压缩,动态规划)

    懒得搞题目了 哦对了,这题双倍经验 题解 装压DP 利用位运算很容易解决相邻位的问题 其实我的还是太复杂了 具体的,更加好的位运算的写法可以参考YL大佬,但是我也搞不到他代码,因为他太强了. 然而他博 ...

  5. [Luogu2073]送花

    题面 题目背景 小明准备给小红送一束花,以表达他对小红的爱意.他在花店看中了一些花,准备用它们包成花束. 题目描述 这些花都很漂亮,每朵花有一个美丽值W,价格为C. 小明一开始有一个空的花束,他不断地 ...

  6. centos7下搭建 MongoDB -01

    距离上次写的一篇mongoDB搭建已经有一年多的时间了,刚好这次在公司搭建好在centos7下的mongodb搭建,简单的做一个记录吧 mongo 是一个基于分布式文件存储的数据库,数据主要存储在磁盘 ...

  7. HAproxy负载均衡

    HAproxy 简介 HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案. HAProxy特别适用于那些负载特大的web站点,这 ...

  8. Spring AOP梳理

    一.Srping AOP AOP(Aspect Oriented Programming)解释为面向切面编程,何为切面,用刀把一块面包切成两半,刀切下去形成的面就叫切面,那么面向切面的就是形成切面的这 ...

  9. MySQL事务以及隔离级别

    前言: 我一直想不到一个好的标题应该怎么写.我想MySQL的一些重要的内容.我在两次面试中都遇到过的,但直接用MySQL标题好像又不太贴切.干脆就是所写的内容吧. MySQL事务: transacti ...

  10. clientTop,scrollTop,兼容

    在开发中常见的额兼容性问题: scrollTop问题: function scroll() { // 开始封装自己的scrollTop if(window.pageYOffset != null) { ...