pl/sql进阶---例外处理

PL/SQL进阶----例外处理

ORACLE将例外分为预定义例外,非预定义例外和自定义例外三种。

预定义例外用于处理常见的ORACLE错误

非预定义例外用于处理预定义例外不能处理的例外

自定义例外用于处理与ORACLE错误无关的其他情况

A>例外传递

如果不处理例外会出现什么情况:

案例,编写一个过程,可接收雇员的编号,如果雇员的编号不存在

---例外案例

declare

--定义

v_name emp.ename%type;

begin

--执行

select ename into v_ename from emp where empno=&gno;

dbms_output.put_line('名字:'||v_ename);

exception

when no_data_found then

dbms_output.put_line('编号不存在');

end;

/

处理预定义例外

预定义例外是由PL/SQL所提供的系统例外。当pl/sql应用程序违反了oracle规定的限制时,则会隐含的触发一个内部例外。

PL/SQL为开发人员提供了二十多个预定义的例外。

▲预定义例外 case_not_found

在开发PL/SQL块中编写case语句时,如果在when子句中没有包含必须的条件分支,就会触发case_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;

▲预定义例外 cursor_already_open

当重新打开已经打开的游标时,会隐含的触发例外 cursor_already_open

------------------------------------------------

declare

cursor emp_cursor is select ename,sal from emp;

begin

open emp_cursor;

for emp_record in emp_cursor loop

dbms_output.put_line(emp_record1.ename);

end loop;

exception

when cursor_already_open then

dbms_output.put_line('游标已经打开');

end;

/

▲预定义例外  dup_val_on_index

在唯一索引所对应的列上插入重复的值时,会隐含的触发例外 dup_val_on_index例外

begin

insert into dept values(10,'公关部','北京');

exception

when dup_val_on_index then

dbms_output.put_line('在deptno列上不能出现重复值');

end;

▲预定义例外 valid_cursor

当试图在不合法的游标上执行操作时,会触发该例外

例如:试图从没有打开的游标提取数据,或是关闭没有打开的游标。则会触发该例外。

declare

cursor emp_cursor is select ename,sal from emp;

emp_record emp_cursor%rowtype;

begin

---open emp_cursor;---打开游标

fetch emp_cursor into emp_record;

dbms_output.put_line(emp_record.ename);

close emp_cursor;

exception

when invalid_cursor then

dbms_output.put_line('请检测游标是否打开');

end;

▲预定义例外 invalid_number

当输入的数据有误时,会触发该例外

比如:数字100改成了loo就会触发该例外

begin

update emp set sal=sal+'loo';

exception

when invalid_number then

dbms_output.put_line('输入的数字不正确');

end;

▲预定义例外  no_data_found

当执行select into 没有返回行,就会触发该例外

。。。

▲与定义例外 too_many_rows

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

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;

▲预定义例外 zero_divide

当执行2/0的操作时,则会触发该例外。

▲预定义例外 value_error

当在执行赋值操作时,如果变量的长度不足以容纳实际数据,则会触发该例外value_error,比如:

declare

v_ename varchar2(5);

begin

select ename into v_ename from emp where empno=&no1;

dbms_output.put_line(v_ename);

exception

when value_error then

dbms_output.put_line('变量尺寸不足');

end;

▲预定义例外 …………

………………

其他预定义例外

①login_denide

当用户非法登录时,会触发该例外

②not_logged_on

如果用户没有登录就执行dml操作,就会触发该例外

③storage_error

如果超出了内存空间或是内存被损坏,就触发该例外

④timeout_on_resource

如果ORACLE在等待资源时,出现了超时就触发该例外

 非预定义例外

非预定义例外用于处理与预定义例外无关的ORACLE错误。使用预定义例外只能处理21个ORACLE错误,而当使用PL/SQL开发应用程序的时候,可能回遇到其他的一些ORACLE错误。比如在PL/SQL块中执行dml语句时,违反了约束规定等等,在这样的情况下,也可以处理ORACLE的各种例外。

处理自定义例外

预定义例外和自定义例外都与ORACLE错误相关的,并且出现的ORACLE错误会隐含的触发相应的例外;而自定义例外与ORACLE错误没有任何的关联,它是有开发人员为特定的情况所自定义的例外。

?请编写一个PL/SQL块,接收一个雇员的编号,并给该雇员工资增加1000元,如果该雇员不存在,请提示。

---自定义例外

create or replace procedure ex_test(spNo number)

is

---定义一个例外

myex exception;

begin

---执行部分,更新用户sal

update emp set sal=sal+1000 where empno=spNo;

---sql%notfound 这是表示没有update

---raise myex; 触发myex这个自定义例外

if sql%notfound then 

raise myex;

end if;

exception

when myex then

dbms_output.put_line('没有更新任何用户');

end;

时间: 2024-09-20 05:41:17

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

pl/sql进阶---控制结构

pl/sql进阶:控制结构   在任何计算机语言(C, JAVA, PASCAL )都有各种控制语句(条件语句,循环语句,顺序控制结构-)在 pl/sql 中也存在这样的控制结构. 1)if 语句 2)循环语句 3)控制语句-goto 和 null   >>条件分支语句 pl/sql中提供了三种条件分支语句 if -- then, if--then--else, if--then--elsif--else. A>简单的条件判断  if -- then ?编写一个过程,可以输入一个雇员名,

PL/SQL的进阶----编写分页过程

PL/SQL的进阶----编写分页过程 介绍 分页是任何一个网站(bbs,网上商城, blog)都会使用到的技术,因此学习 pl/sql 编程开发就一定要掌握该技术.   ①无返回值的存储过程 古人云:欲速则不达.首先是掌握最简单的存储过程,无返回值的存储过程: 案例:现在有一张表,字段有"书号,书名,出版社".请编写一个存储过程,可以向book表添加书,要求通过JAVA程序调用该过程. ----book表 SQL>create table book (boodId number

在PL/SQL 开发中调试存储过程和函数的一般性方法

存储过程|函数 在PL/SQL 开发中调试存储过程和函数的一般性方法摘要: Oracle 在PLSQL中提供的强大特性使得数据库开发人员可以在数据库端完成功能足够复杂的任务, 本文将结合Oracle提供的相关程序包(package)以及一个非常优秀的第三方开发工具来介绍在PLSQL中开发及调试存储过程的方法,当然也适用于函数. 版权声明: 本文可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息.原文出处: http://www.aiview.com/notes/ora_using_

PL/SQL程序结构

什么是PL/SQL程序     前面第4章学习的标准化的SQL语言对数据库进行各种操作,每次只能执行一条语句,语句以英文的分号";"为结束标识,这样使用起来很不方便,同时效率较低,这是因为Oracle数据库系统不像VB.VC这样的程序设计语言,它侧重于后台数据库的管理,因此提供的编程能力较弱,而结构化编程语言对数据库的支持能力又较弱,如果一些稍微复杂点的管理任务都要借助编程语言来实现的话,这对管理员来讲是很大的负担.    正是在这种需求的驱使下,从Oracle 6开始,Oracle公

PL/SQL --&amp;gt; 异常处理(Exception)

--================================ -- PL/SQL --> 异常处理(Exception) --================================           Exception是一种PL/SQL标识符,当运行的PL/SQL块出现错误或警告,则会触发异常处理.为了提高程序的健壮性,可以在PL/SQL块中引 入异常处理部分,进行捕捉异常,并根据异常出现的情况进行相应的处理.   一.异常的类型      ORACLE异常分为两种类型:系统

PL/SQL异常处理(原创)

Exception概述 Exception是一种PL/SQL标识符,当运行的PL/SQL块出现错误或警告,则会触发异常处理.为了提高程序的健壮性,可以在PL/SQL块中引入异常处理部分,进行捕捉异常,并根据异常出现的情况进行相应的处理.ORACLE异常分为两种类型:系统异常.自定义异常.其中系统异常又分为:预定义异常和非预定义异常.预定义异常ORACLE定义了他们的错误编号和异常名字,常见的预定义异常处理如下 错误号 异常错误信息名称 说明 ORA-0001 Dup_val_on_index 违

Oracle教程之pl/sql简介_oracle

本文实例讲述了Oracle的pl/sql.分享给大家供大家参考,具体如下: 一.pl/sql 是什么 pl/sql(procedural language/sql)是oracle在标准的sql语言上的扩展. pl/sql不仅允许嵌入sql语言,还可以定义变量和常量,允许使用条件语句和循环语句,允许使用例外处理各种错误,这样使得它的功能变得更加强大. 二.为什么要学pl/sql 1.提高应用程序的运行性能 2.模块化的设计思想(分页的过程,订单的过程,转账的过程..) 3.减少网络传输量 4.提高

【PL/SQL】TOM 的 show_space()

只适用于非ASSM: create or replace procedure show_space ( p_segname in varchar2, p_owner in varchar2 default user, p_type in varchar2 default 'TABLE' ) as l_free_blks number; l_total_blocks number; l_total_bytes number; l_unused_blocks number; l_unused_byt

PL/SQL DEVELOPER 6.0.5 发布了

March 14, 2005 - Version 6.0.5 releasedEnhancements Insert Template context menu would hide first item and add dummy item Insert Template did not show subfolders Connection preferences in registry (Logon section) did not work Projects: progress while