抛出异常

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] );

error_number 是从 –20,000 到 –20,999 之间的参数,这样就不会与 ORACLE 的任何错误代码发生冲突

error_message 是相应的提示信息(< 2048 字节),

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

sql数据导入错误代码: 0x80004005_PL/SQL 非预定义异常、自定义异常处理、RAISE_APPLICATION_ERROR...相关推荐

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

    抛出异常 Oracle有三种类型的异常错误: 1. 预定义(Predefined)异常 ORACLE预定义的异常情况大约有24个.对这种异常情况的处理,无需在程序中定义,由ORACLE自动将其引发. ...

  2. PLSQL——动态SQL、异常(预定义异常、非预定义异常、自定义异常)、引发应用程序错误

    1.动态 SQL 动态 SQL 是指在PL/SQL程序执行时生成的 SQL 语句 编译程序对动态 SQL 不做处理,而是在程序运行时动态构造语句.对语句进行语法分析并执行 DDL 语句命令和会话控制语 ...

  3. sql数据导入错误代码: 0x80004005_SQL入门第八关 项目实战

    不知不觉,学SQL已经一个多月了,每天下班学一个小时,有空做做练习题.从之前的焦虑到现在已经有了一定的自信了,猴子的课程真的很适合小白入门,尤其是SQL学习群里,助教老师很尽责,每个问题都会解答.当然 ...

  4. sql azure 语法_Azure SQL数据同步–在Azure SQL数据库之间复制数据和架构更改

    sql azure 语法 In this article, we will review how to configure the sync group to replicate data betwe ...

  5. Oracle PL/SQL开发基础(第三十弹:预定义异常)

    无论是预定义错误还是自定义错误,Oracle在内部都会隐含地触发一个错误,每个错误都有一个序号,SQLCODE就是异常的编码,SQLERRM用来获取异常的信息.但是在PL/SQL进行异常处理时,不能直 ...

  6. 预定义异常 - PHP手册笔记

    原文:预定义异常 - PHP手册笔记 Exception是所有异常的基类,类摘要如下: <?php class Exception {protected string $message; // ...

  7. (转)资料收集,新手必备的sql数据导入导出知识

    转载自csdn SQL SERVER 与ACCESS.EXCEL的数据转换 熟悉SQL SERVER 2000的数据库管理员都知道,其DTS可以进行数据的导入导出,其实,我们也可以使用Transact ...

  8. SQL数据导入导出问题总结

    大家打开这个链接可以看到很多数据库的连接方法.http://www.connectionstrings.com/ 这些数据库之间的数据交换就是这个贴子所要总结的内容. (一)SQL Server之间 ...

  9. 如何将sql数据导入到oracle数据库,将SQLServer的数据导入到Oracle数据库的方法-Oracle...

    1.首先在SQL Server的电脑上安装Oracle,或者是操作的电脑上安装Oracle,如果没有,导出时会提示失败 2.打开SQL Server,右键点击要导出的数据库,选择"任务&qu ...

最新文章

  1. python_文件处理
  2. 基于深度前馈序列记忆网络,如何将语音合成速度提升四倍?
  3. sql查询所有商品的信息_属于菜鸟的sql 干货(7)
  4. 蓝桥备赛第四周 同余+并查集
  5. 【操作系统复习】系统调用
  6. ​三位中国科学家与诺贝尔物理奖的擦肩而过
  7. GitHub建立个人网站(二)
  8. 用Node-Inspector调试NodeJs程序
  9. 向架构师进军--定义需求
  10. linux常用指令学习记录
  11. huffman编码的程序流程图_基于哈夫曼编码的压缩解压程序(C 语言)
  12. 2021年G2电站锅炉司炉考试题库及G2电站锅炉司炉考试报名
  13. 锂电池电源管理系统设计与实现(单片机)
  14. Latex 数学符号速查字典(第2版)
  15. chrome下载速度慢,提高下载速度
  16. 一次下载多个文件的解决思路-JS
  17. 安卓逆向——AS开发Xposed插件HOOK案例
  18. 永久关闭IE 浏览器停止支持提示的方法 (针对360安全卫士或Windows 10)
  19. 如何使用word模板生成word文档(文本,图片)
  20. Redis批量删除Key的三种方式(linux和windows环境下都有)

热门文章

  1. react全局方法_前端面试题 ---react
  2. python无所不能_python-列表
  3. 查找整数c语言编程,关于算法:查找整数的位数
  4. 积分上下限无穷_数学分析|第九章 定积分利用等价无穷小量和定积分定义解决数列极限问题总结...
  5. C++ 重载左移和右移运算符
  6. 车仪表台上的装饰_一汽大众销量最差的车,旅行车蔚领为什么在国内没有市场?...
  7. 没有bug队——加贝——Python 练习实例 1,2
  8. UFIDL稀疏自编码代码实现及解释
  9. js预览本地word文档_Github+docsify打造在线文档
  10. 令xtu3service开机时立即启动_Mac开机时可以使用的快捷键 苹果电脑快捷键使用介绍...