Oracle PL/SQL 非预定义异常、自定义异常处理、RAISE_APPLICATION_ERROR

标签: oracle pl sql | 发表时间:2013-06-17 06:00 | 作者:vking_wang
出处:http://blog.csdn.net

抛出异常

Oracle有三种类型的异常错误:

1. 预定义(Predefined)异常

ORACLE预定义的异常情况大约有24个。对这种异常情况的处理,无需在程序中定义,由ORACLE自动将其引发。

2. 非预定义(Predefined)异常

即其他标准的ORACLE错误。对这种异常情况的处理,需要用户在程序中定义,然后由ORACLE自动将其引发。

3. 用户定义(User_define)异常

程序执行过程中,出现编程人员认为的非正常情况。对这种异常情况的处理,需要用户在程序中定义,然后显式地在程序中将其引发。


在PL/SQL中有三种方式抛出异常

  • 通过PL/SQL运行时引擎——抛出Oracle异常

  • 使用RAISE语句——抛出用户定义异常

  • 调用RAISE_APPLICATION_ERROR 存储过程——抛出用户定义异常


非预定义异常

因为非预定义异常只有编号,没有名称,所以不能直接处理。

1、在PL/SQL 块的定义部分定义异常情况:

 <异常情况>  EXCEPTION; 

2、将其定义好的异常情况,与标准的ORACLE 错误联系起来,使用EXCEPTION_INIT语句:

PRAGMA EXCEPTION_INIT(<异常情况>, <错误代码>);

3、在PL/SQL 块的异常情况处理部分对异常情况做出相应的处理。

INSERT INTO departments VALUES(50, 'FINANCE', 'CHICAGO');

DECLARE
   v_deptno departments.department_id%TYPE := &deptno;
   deptno_remaining EXCEPTION;                     --1、定义异常
   PRAGMA EXCEPTION_INIT(deptno_remaining, -2292); --2、关联
   -- -2292 是违反一致性约束的错误代码 
BEGIN
   DELETE FROM departments WHERE department_id = v_deptno;
EXCEPTION
   WHEN deptno_remaining THEN                      --3、处理
      DBMS_OUTPUT.PUT_LINE('违反数据完整性约束!');
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
END;

用户自定义异常处理

用户定义的异常错误是通过显式使用 RAISE 语句来触发。

1、在PL/SQL 块的定义部分定义异常情况 ;

2、RAISE <异常情况>;

3、在PL/SQL 块的异常情况处理部分对异常情况做出相应的处理。

DECLARE
   v_empno employees.employee_id%TYPE :=&empno;
   no_result  EXCEPTION;              --1、定义
BEGIN
   UPDATE employees SET salary = salary+100 WHERE employee_id = v_empno;
   IF SQL%NOTFOUND THEN
      RAISE no_result;                --2、抛出
   END IF;
EXCEPTION
   WHEN no_result THEN                --3、处理
      DBMS_OUTPUT.PUT_LINE('你的数据更新语句失败了!');
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
END;


RAISE_APPLICATION_ERROR

调用DBMS_STANDARD(ORACLE提供的包)包所定义的RAISE_APPLICATION_ERROR过程,可以 重新定义异常错误消息,将应用程序专有的错误从服务器端转达到客户端应用程序。它为应用程序提供了一种与ORACLE交互的方法。

语法如下:

     RAISE_APPLICATION_ERROR(error_number, error_message, [keep_errors] );

  1. error_number 是从 –20,000 到 –20,999 之间的参数,这样就不会与 ORACLE 的任何错误代码发生冲突
  2. error_message 是相应的提示信息(< 2048 字节),
  3. keep_errors 为可选,如果keep_errors =TRUE ,则新错误将被添加到已经引发的错误列表中。如果keep_errors=FALSE(缺省),则新错误将替换当前的错误列表。

There are two uses for RAISE_APPLICATION_ERROR.

The first is to replace generic Oracle exception messages with our own, more meaningful messages.

The second is to create exception conditions of our own, when Oracle would not throw them.

create or replace procedure new_emp
    ( p_name in emp.ename%type
      , p_sal in emp.sal%type
      , p_job in emp.job%type
      , p_dept in emp.deptno%type
      , p_mgr in emp.mgr%type 
      , p_hired in emp.hiredate%type := sysdate )
is
    invalid_manager exception;                     --1、定义
    PRAGMA EXCEPTION_INIT(invalid_manager, -2291); --2、关联
    dummy varchar2(1);
begin
    if trunc(p_hired) > trunc(sysdate) 
    then
        raise_application_error
           (-20000, 'NEW_EMP::hiredate cannot be in the future'); --3、抛出自定义异常
    end if;

    insert into emp
        ( ename
          , sal
          , job
          , deptno
          , mgr 
          , hiredate )
    values      
        ( p_name
          , p_sal
          , p_job
          , p_dept
          , p_mgr 
          , trunc(p_hired) );
exception
    when dup_val_on_index then
        raise_application_error
            (-20001, 'NEW_EMP::employee called '||p_name||' already exists', true); --3、包装Oracle异常
    when invalid_manager then
        raise_application_error
            (-20002, 'NEW_EMP::'||p_mgr ||' is not a valid manager'); --3、包装自定义异常

end;
/

客户端调用时会提示详细异常信息:

-- 测试RAISE_APPLICATION_ERROR自定义异常
SQL> exec new_emp ('DUGGAN', 2500, 'SALES', 10, 7782, sysdate+1)
BEGIN new_emp ('DUGGAN', 2500, 'SALES', 10, 7782, sysdate+1); END;

*
ERROR at line 1:
ORA-20000: NEW_EMP::hiredate cannot be in the future --ORA-20000
ORA-06512: at "APC.NEW_EMP", line 16
ORA-06512: at line 1

-- 测试RAISE_APPLICATION_ERROR包装自定义异常
SQL> exec new_emp ('DUGGAN', 2500, 'SALES', 10, 8888, sysdate)
BEGIN new_emp ('DUGGAN', 2500, 'SALES', 10, 8888, sysdate); END;

*
ERROR at line 1:
ORA-20002: NEW_EMP::8888 is not a valid manager
ORA-06512: at "APC.NEW_EMP", line 42
ORA-06512: at line 1


-- 测试RAISE_APPLICATION_ERROR包装Oracle异常
SQL> exec new_emp ('DUGGAN', 2500, 'SALES', 10, 7782, sysdate)

PL/SQL procedure successfully completed.

SQL>
SQL> exec new_emp ('DUGGAN', 2500, 'SALES', 10, 7782, sysdate)
BEGIN new_emp ('DUGGAN', 2500, 'SALES', 10, 7782, sysdate); END;

*
ERROR at line 1:
ORA-20001: NEW_EMP::employee called DUGGAN already exists
ORA-06512: at "APC.NEW_EMP", line 37
ORA-00001: unique constraint (APC.EMP_UK) violated --同时打印原始堆栈
ORA-06512: at line 1








作者:vking_wang 发表于2013-6-17 14:00:47 原文链接
阅读:59 评论:0 查看评论

相关 [oracle pl sql] 推荐:

Oracle PL/SQL 编程基础 实例 2

- - CSDN博客数据库推荐文章
if  循环  控制语句 . --编写一个过程,可以 输入一个雇员名,如果该雇员的工资低于2000就给他增加10%.           --判断. --======####案例s33 编写一个过程,可以 输入一个雇员名,如果该雇员的补助不是0就在原基础上增加100,如果是0就加200.           --判断.

Oracle PL/SQL 编程基础 实例

- - CSDN博客数据库推荐文章
1, exec 过程名 (参数,.  call 过程名 (参数  ).   dbms_output.put_line('姓名:'||v_ename);.                           --执行部分.  --------------函数 -------.    -------包------------由包规范和包体组成的.

Oracle PL/SQL 非预定义异常、自定义异常处理、RAISE_APPLICATION_ERROR

- - CSDN博客互联网推荐文章
Oracle有三种类型的异常错误:. 1. 预定义(Predefined)异常. ORACLE预定义的异常情况大约有24个. 对这种异常情况的处理,无需在程序中定义,由ORACLE自动将其引发. 2. 非预定义(Predefined)异常. 即其他标准的ORACLE错误. 对这种异常情况的处理,需要用户在程序中定义,然后由ORACLE自动将其引发.

不安装Oracle客户端情况下用PL/SQL连接远程服务器

- - 数据库 - ITeye博客
首先下载免安装的客户端instantclient_12_1,. 解压缩 instantclient_12_1 到 D:\Oracle\instantclient_12_1(解压到任意目录即可). 在文件夹内建立目录, /NETWORK/ADMIN. 在该目录下,新建文件tnsnames.ora. 在thsnames.ora中写入:.

PL/SQL动态SQL(原创)

- - ITeye博客
使用动态SQL是在编写PL/SQL过程时经常使用的方法之一. 很多情况下,比如根据业务的需要,如果输入不同查询条件,则生成不同的执行SQL查询语句,对于这种情况需要使用动态SQL来完成. 再比如,对于分页的情况,对于不同的表,必定存在不同的字段,因此使用静态SQL则只能针对某几个特定的表来形成分页.

PL/SQL学习汇总

- - CSDN博客数据库推荐文章
sql是非过程语言,在编程中总是会用到过程化控制,PL/SQL就是提供了过程化控制的语言来弥补SQL语言的这一点缺陷. PL/SQL 语句在后面的执行中  pl/sql语句由 PL/SQL引擎执行,SQL语句由 sql引擎执行. PL/SQL 集成了过程化与SQL一起使用, 提高了性能,因为一个过程执行完成后,.

PL/SQL流程控制(原创)

- - ITeye博客
类似于高级语言,流程控制语句是PL/SQL语言的重要组成部分. 这些流程控制语句使得PL/SQL加大了代码的灵活性和多样性,大大简化了程序的编写. 下面将列出流程控制语句并给出具体事例. 判断condition是否成立,成立就执行IF 与END IF 之间的语句. 例:输入员工编号,查询其工资,如果他们的职位是CLERK,则工资增加%,再显示修改前后的工资数.

PL/SQL Developer 9.06.1665 简体中文注册版

- - 快乐无极的博客
此版是最新9.06.1665版+汉化包,先安装主程序,再安装汉化包,内附注册码. 仅供技术交流和测试之用,如做其它用途,请支持正版. Developer是一个集成开发环境,专门面向Oracle数据库存储程序单元的开发. 如今,有越来越多的商业逻辑和应用逻辑转向了Oracle. Server,因此,PL/SQL编程也成了整个开发过程的一个重要组成部分.

利用pl/sql执行计划评估SQL语句的性能简析

- - Oracle - 数据库 - ITeye博客
    一段SQL代码写好以后,可以通过查看SQL的执行计划,初步预测该SQL在运行时的性能好坏,尤其是在发现某个SQL语句的效率较差时,我们可以通过查看执行计划,分析出该SQL代码的问题所在. 那么,作为开发人员,怎么样比较简单的利用执行计划评估SQL语句的性能呢. 总结如下步骤供大家参考:. 1、 打开熟悉的查看工具:PL/SQL Developer.

Oracle SQL性能优化

- - 数据库 - ITeye博客
(1)      选择最有效率的表名顺序(只在基于规则的优化器中有效):. ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表. 如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.