在 PL / SQL 中错误信息处理过程分为两步: 引发错误和处理错误。编译处误是由 PL/SQL 编译器产生的,它们应该在执行程序前解决。
PL/SQL 异常:类型与定义
处理异常有 3 个基本的步骤:
1、 声明异常(显式或隐式地声明)
2、 引发异常(显式或隐式地引发)
3、 处理异常(如果需要处理的话)
PL/SQL 异常都具有以下几个基本特征
错误类型:这界定了错误是 ORA 错误或 PLS 错误
错误代码:一串表示错误代码的数字
错误文本:错误信息的文本,包括错误代码
PL/SQL 的内置错误
下面列出了在异常处理中使用的声明 / 语句:
EXCEPTION 声明 : 在声明用户定义的异常时,必须使用这种说明
RAISE 语句:引发异常时必须使用的指令
PRAGMA EXCEPTION_INIT 指令:把 Oracle 错误与用户自定义异常关联时使用这种指令。
SAVE EXCEPTION 子句: 这是 oracle 9i 中新增加的一个内容,主要用于批绑定处理中,如果有一执行失败,则处理会继续进行而不会停止。
函 数
可以使用下面两个函数捕获在 PL/SQL 中发生的 Oracle 错误信息
SQLCODE :该函数返回怀疑有错误的错误代码
SQLERRM :该函数返回怀疑有错误的错误文本
过程
可以使用下面过程的 PL/SQL 中定义用户错误消息。
RAISE_APPLICATION_ERROR :可以使用这个过程来定义用户错误消息和在使用该过程的位置上暂停程序的执行。
异常处理程序
虽然 pl/sql 代码块中异常处理部分是不可缺少的,但是它对于任何 pl/sql 程序来说却都是必要的。强烈推荐在每一个 pl/sql 程序中编写异常处理代码
异常处理程序是由 EXCEPTION WHEN…… 子句定义的。下面是其语法
EXCEPTION WHEN exception_name THEN
…..
也可以指定多个异常,如下所示:
EXCEPTION
WHEN exception_nam1 THEN
…….
WHEN exception_nam2 THEN
……
WHEN OTHERS THEN
….
当 ORACLE 错误发生的时候,如果有个紧接着它的异常处理程序,控制就会立即转移到该异常处理程序中;如果没有,控制权就转移到下一个可用的异常处理程序中;如果没有任何异常,程序就会以一个未处理异常形式终止。
PL/SQL 异常类型
Pl/sql 中异常基本上可以分为以下几类
1、 预定义异常
2、 未定义的 Oracle 异常
3、 用户自定义异常
4、 用户自定义的 PL/SQL 错误信息
处理 PL/SQL 异常
有两种处理异常的方法:
1、 处理异常以后程序继续执行
2、 处理异常以后程序停止执行
发生异常时,如果程序需要继续执行,则需要执行一下以个步骤:
1、 显式或隐式地引发异常
2、 对已经引发的异常, ….
3、 异常处理程序的代码执行以后,程序执行就会相应的恢复或终止
4、 如果在整个程序中都没定义异常处理程序,程序就会在引发异常的位置终止,引发异常的执行点之后代码就得不到执行。
create or replace procedure
p1 is
v_temp varchar2( 200 );
begin
select al_name into v_temp from addr_alias where al_id= 'aaa3' ;
dbms_output.put_line( 'sfsafdsafasdfdfsa' );
end ;
在以上代码中,执行 select 语句是出现异常,不执行 dbms_output 语句
create or replace procedure
p1 is
v_temp varchar2( 200 );
begin
select al_name into v_temp from addr_alias where al_id= 'aaa3' ;
dbms_output.put_line( 'sfsafdsafasdfdfsa' );
EXCEPTION when NO_DATA_FOUND then
dbms_output.put_line(sqlerrm);
end ;
以上代码加了了异常处理,执行时输出 :
ORA-01403: no data found
异常信息,说明在程序在 select 出现异常就跳转到异常处理处,执行异常处理程序,但并没有执行 dbms_output.put_line(‘afasfads’); 语句输出信息,异常出现 — 》处理异常 — 》结束运行。
create or replace procedure
p1 is
v_temp varchar2( 200 );
begin
select al_name into v_temp from addr_alias where al_id= '123456789' ;
dbms_output.put_line( 'sfsafdsafasdfdfsa' );
EXCEPTION
when NO_DATA_FOUND then
dbms_output.put_line(sqlerrm);
whenothersthen
dbms_output.put_line( 'others exception--->' ||sqlerrm);
end ;
以上代码执行输出结果是 :
ORA-01403: no data found
和上一个代子一样,这例子说明在多个异常体里,只有一个异常被执行了。
以上例子都是程序运行时出现异常,而停止运行。
处理异常后继续执行
create or replace procedure p2
is
v_temp varchar2( 200 );
begin
begin
select al_name into v_temp from addr_alias where al_id= '123456789' ;
dbms_output.put_line( 'ssssskkddd' );
exception when no_data_found then
select al_name into v_temp from addr_alias where al_id= '3' ;
dbms_output.put_line( 'v_temp-->' ||v_temp|| ' sqlerrm-->' ||sqlerrm);
end ;
begin
dbms_output.put_line( ' 第二 begin end;' );
exception
when no_data_found then
dbms_output.put_line( 'aaaaaaa' );
end;
exception
whenothersthen
dbms_output.put_line( ' 最外层 exception...' );
end;
以上程序中运行时输出的结果如下:
v_temp--> 龙口 .. sqlerrm-->ORA-01403: no data found
第二层 begin end;
结果说明在第一个 begin end; 执行时发了异常,就执到行该层的 exception 来处理异常,异常处理完后执行第二个 begin end; 的代码,当你把第一层 begin end; 中的异常处理部分注释掉后,输出的结果如下 :
最外层 exception...
这结果说明了,在第一个 begin end; 中因为没有异常处理模块,所以程序跳到上一层寻找异常处模块来处理异常,同第一个 begin end; 同一个层次的第二个 begin end; 模块的代码就不会执行,如果在最外层也找不到异常处理模块就执行默认的异常处理模块。
处理用户自定义异常
用户自定义异常,像其它 pl/sql 一亲友,显式地声明用户自定义异常。可以使用 EXCEPTION 关键字指定这些异常的数据类型。其语法如下 :
1 、定义自定义异常
Exception_name EXCEPTION;
注意:必须用 EXCEPTION 关键字定义用户自定义异常
用户自定义异常不与任何错误代码或错误文本关联
2 、使用 RAISE 语句引发用户自定义异常
Raise exception_name;
例子 :
Declare
Examp_exception EXCEPTION;
Begin
If ( 条件 ) then
Raise examp_exception;
End if;
Exception
When examp_exception then
……
End;
处理声明和异常处理部分引发的异常
1、 在声明部分引发的异常
在声明部分引发的异常必须在其紧接着的封闭块( begin ..end )中的相关处理程序中进行处理。如果紧接着的封闭块中不存在该处理程序,控制就会转到有该处理程序的第一个封闭块。
如
Declare
V_num number(2) :=100
Begin
Null;
..
Exception
when value_error then
null;
when others then
null;
End;
这样的定义是不能正确处理掉声时所产生的异常。为此必须定义一个封闭块来处理该封闭块的声明部分引发的异常,代码如下 :
Declare
V_num number(2) :=100
Begin
Null;
..
Exception
when value_error then
null;
when others then
null;
End;
Exception
when value_error then
dbms_output.put_line(‘value error occurred’);
when others then
dbms_output.put_line(‘…’);
End;
这样才能正确的处理声明时的异常
2、 处理异常部分引发的异常
只能在异常模块的内部引发 (raise) 外部异常。如:
Declare
Excep1 exception;
Excep2 exception;
Begin
Begin
If ( 条件 ) then
Raise excep1;
End if;
Exception
When excep1 then
Raise excep2;
End;
Exception
When excep2 then
Null;
When others then
Dbms_output.put_line(‘………..’);
End;
关于异常的我想这么多够用了,异常这一节还有其它的一些内容。
分享到:
相关推荐
PL/SQL数据库学习笔记 PL/SQL是一种高级的程序语言,主要用于Oracle数据库管理系统中。下面是PL/SQL数据库学习笔记的知识点总结。 一、基本原则 *瀑布模型:需求分析→设计(概要设计,详细设计:SQL语句,变量...
以下是对PL/SQL的学习笔记的详细解析: 1. **什么是PL/SQL语言** PL/SQL是Oracle数据库为数据库管理员和开发人员设计的一种编程语言。它扩展了SQL的功能,允许编写包含控制结构、变量、过程和函数的程序段,这些...
PL/SQL是Oracle公司开发的一种过程化SQL扩展,它是Oracle数据库的重要组成部分,用于在数据库服务器上编写存储过程、函数、触发器、包等可执行...通过学习和掌握PL/SQL,开发者可以构建高效、复杂的数据库应用程序。
ORACLE PL/SQL是从入门到精通的专业知识,涵盖了数据库开发与管理的多个方面,包括...这本书籍将为读者提供一个全面、系统的学习路径,帮助数据库管理员、开发人员深入理解并掌握ORACLE PL/SQL的强大功能和应用技巧。
在学习PL/SQL的过程中,理解这些基本概念和结构是至关重要的。通过实践编写存储过程、函数和触发器,你可以逐渐掌握PL/SQL的强大功能,并利用它来解决实际的数据库编程问题。对于初学者来说,循序渐进、结合实例学习...
在这个“我的PL/SQL学习笔记(一)”中,我们将探讨PL/SQL的基础知识,包括其语法结构、变量声明、流程控制以及如何与Oracle数据库中的数据进行交互。 首先,PL/SQL的基本结构分为声明部分、执行部分和异常处理部分...
总的来说,“PL/SQL超级笔记”应该涵盖了从基本语法到高级特性的全面教程,通过学习,新手可以逐步掌握如何使用PL/SQL进行数据库编程,从而更好地管理和操作Oracle数据库。配合"oracle_ppt"中的PPT材料,学习效果会...
### PL/SQL学习笔记4 —— 集合与成员函数 #### 一、PL/SQL 表(索引表) 在PL/SQL中,**索引表**(也称为**PL/SQL表**)是一种非常有用的结构,它类似于数组但具有更多的灵活性。这种表是非持久化的,即它们不会...
### PL/SQL听课笔记 #### 一、PL/SQL简介 **PL/SQL**(Procedural Language for SQL)是一种专门为Oracle数据库设计的过程化语言扩展。它是在标准SQL基础上增加了一系列高级编程特性,如变量、控制结构、函数、...
在PL/SQL编程中,游标是处理查询结果集的重要工具。它们允许程序逐行处理结果,而不是一次性加载所有数据,这对于大型数据集尤其有用,因为它可以节省内存并提高性能。下面将详细解释游标的基本概念、分类以及如何在...
### PL/SQL 存储过程知识点详解 #### 1. PL/SQL 存储过程概述 PL/SQL(Procedure Language for SQL)是...通过这些基本概念的学习,可以帮助开发者更好地掌握 PL/SQL 的使用技巧,提高数据库应用程序的效率和性能。
在PL/SQL编程中,存储过程和函数是关键的组件,它们允许我们将可重用的代码逻辑存储在数据库中,以便于管理和调用。本文主要探讨了存储过程、函数以及程序包的概念,特点,创建方法,执行方式,权限管理以及参数处理...
这篇课堂笔记主要涵盖了基础的SQL查询语法和部分PL/SQL概念。 首先,SQL查询的基础是从数据库中选择数据。`SELECT`语句用于指定需要选取的列,如`SELECT ename, sal, job FROM emp;`。字段顺序可以自由调整,例如`...
在PL/SQL的学习中,分区是数据库管理大型数据集的一种高效方法,特别是在处理大数据量时。本篇笔记主要探讨了何时应该使用分区以及Oracle支持的分区类型。 首先,当面对超过2GB的大数据表时,分区是十分必要的。这...
本文将深入探讨从"SQL,PL/SQL学习笔记"中提取的关键知识点,帮助编程人员更好地理解和运用这两种语言。 首先,我们关注SQL并行查询。通过`ALTER SESSION ENABLE PARALLEL DMl`,我们可以开启会话的并行DML操作,这...
PL/SQL,全称Procedural Language/Structured Query Language,是Oracle数据库的一种扩展语言,用于处理数据库中的数据和实现复杂的业务逻辑。以下是对PL/SQL的基础知识进行的详细阐述: 1. **匿名块与命名块**: ...