pl/sql进阶--例外处理
在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进阶--例外处理的更多相关文章
- pl/sql进阶——例外处理
在pl/sql的执行过程中发生异常时系统所作的处理称为一个例外情况(exception).通常例外情况的种类有三种: ①预定义的oracle例外情况,oracle预定义的例外情况大约有24个,对于这种 ...
- pl/sql进阶一控制结构
在任何计算机语言(c,java,c#,c++)都有各种控制语句(条件语句,循环结构,顺序控制结构…),在pl/sql中也存在这样的控制结构. 在本部分学校完毕后,希望大家达到: 1)使用各种if语句 ...
- 二十五、oracle pl/sql进阶--控制结构(分支,循环,控制)
一.pl/sql的进阶--控制结构在任何计算机语言(c,java,pascal)都有各种控制语句(条件语句,循环结构,顺序控制结构...),在pl/sql中也存在这样的控制结构.在本部分学习完成后,希 ...
- Oracle实战笔记(第七天)之PL/SQL进阶
一.控制结构 控制结构包括:判断语句(条件分支语句).循环语句.顺序控制语句三种. 1.条件分支语句 if--then:简单条件判断 --编写一个过程,可以输入一个雇员名,如果该雇员名的工资低于200 ...
- Oracle数据库—— PL/SQL进阶编程
一.涉及内容 1.掌握PL/SQL程序块的结构 2.理解并熟练掌握各种变量的应用. 二.具体操作 1.创建一个表messages,该表只有一个字段results 类型是number(2),编写一个块, ...
- Oracle基础(五)pl/sql进阶(分页过程)
编写分页过程 通过pl/sql实现分页过程,再该过程中由简单到难一步步深入,目的在于通过该案例熟悉pl/sql的各种存储过程,包,游标.怎样在java中调用等内容的学习. 1.无返回值 ...
- Oracle PL/SQL随堂笔记总结
1.pl/sql编程 2.存储过程 3.函数 4.触发器 5.包 6.pl/sql基础 -定义并使用变量 7.pl/sql的进阶 8.oracle的视图 1.pl/sql编程 1.理解oracle的p ...
- pl/sql的介绍
为什么需要pl/sql编程? 因为使用纯的sql语句来操作数据库,有先天性的技术缺陷: 1.不能模块编程: 2.执行速度慢: 3.安全性有问题: 4.浪费带宽. pl/sql是什么? pl/sql(p ...
- Oracle基础(四)pl/sql
PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL). PL/SQL是Oracle数据库对SQL语句的扩展.在普通SQL语句的使用上添加了编程语言的特点 ...
随机推荐
- HighCharts之2D金字塔图
HighCharts之2D金字塔图 1.实例源码 Pyramid.html: <!DOCTYPE html> <html> <head> <meta char ...
- Error Code: 1175. You are using safe update mode and you tried to update a table
错误描述 11:14:39 delete from t_analy_yhd Error Code: 1175. You are using safe update mode and you tried ...
- Servlet.service() for Servlet jsp threw exception javax.servlet.ServletException:File "/pageFoo
1.错误描述 Servlet.service() for Servlet jsp threw exception javax.servlet.ServletException:File "/ ...
- html中的块元素和内联元素的区别
一.定义 块元素一般都从新行开始,它可以容纳内联元素和其他块元素,可设置高度.宽度和边距等. 内联元素一般都是基于语义级的基本元素,它只能容纳文本或其他内联元素,主要特点是:和其他元素位于同一行上,高 ...
- 拥抱.NET Core系列:MemoryCache 缓存选项
在上一篇 "拥抱.NET Core系列:MemoryCache 缓存过期" 中我们详细的了解了缓存过期相关的内容,今天我们来介绍一下 MSCache 中的 Options,由此来介 ...
- 利用scrapy模拟登录知乎
闲来无事,写一个模拟登录知乎的小demo. 分析网页发现:登录需要的手机号,密码,_xsrf参数,验证码 实现思路: 1.获取验证码 2.获取_xsrf 参数 3.携带参数,请求登录 验证码url : ...
- winform自动更新程序实现
一.问题背景 本地程序在实际项目使用过程中,因为可以操作电脑本地的一些信息,并且对于串口.OPC.并口等数据可以方便的进行收发,虽然现在软件行业看着动不动都是互联网啊啥的,大有Web服务就是高大上的感 ...
- JQuery移动动画实现点击按钮切换图片--JQuery基础
直接贴源码了哈,这些都是自己总结的……汗水几何?希望能帮到大家. <%@ Page Language="C#" AutoEventWireup="true" ...
- 在实训时做的项目出现的ajax json数据传送的问题
json数据在前后端数据交互的时候非常常见,但是大部分人对json都么有系统的学习过,所以就会出现一些很简单的问题却要非很大劲去解决. 在用json传递数据的时候属性必须用双引号括住,一般如果在进行字 ...
- 12-7jquery选择器学习
p:odd 选择奇数个数的p标签 p:even选择奇数个数的p标签 p:gt(n)选择下标 大于n的p标签 p:lt(n)选择下标小于n的p标签 $(":root " ...