Oracle中RAISE异常深入分析

有三种方式抛出异常
1.通过PL/SQL运行时引擎
2.使用RAISE语句
3.调用RAISE_APPLICATION_ERROR存储过程
当数据库或PL/SQL在运行时发生错误时,一个异常被PL/SQL运行时引擎自动抛出。异常也可以通过RAISE语句抛出
RAISE exception_name;
显式抛出异常是程序员处理声明的异常的习惯用法,但RAISE不限于声明了的异常,它可以抛出任何任何异常。例如,你希望用TIMEOUT_ON_RESOURCE错误检测新的运行时异常处理器,你只需简单的在程序中使用下面的语句:
RAISE TIMEOUT_ON_RESOUCE;
比如下面一个订单输入的例子,若当订单小于库存数量,则抛出异常,并且捕获该异常,处理异常


代码如下:

DECLARE
inventory_too_low EXCEPTION;
---其他声明语句
BEGIN
IF order_rec.qty>inventory_rec.qty THEN
RAISE inventory_too_low;
END IF
EXCEPTION
WHEN inventory_too_low THEN
order_rec.staus:='backordered';
END;

RAISE_APPLICATION_ERROR内建函数用于抛出一个异常并给异常赋予一个错误号以及错误信息。自定义异常的缺省错误号是+1,缺省信息是User_Defined_Exception。RAISE_APPLICATION_ERROR函数能够在pl/sql程序块的执行部分和异常部分调用,显式抛出带特殊错误号的命名异常。  Raise_application_error(error_number,message[,true,false]))
错误号的范围是-20,000到-20,999。错误信息是文本字符串,最多为2048字节。TRUE和FALSE表示是添加(TRUE)进错误堆(ERROR STACK)还是覆盖(overwrite)错误堆(FALSE)。缺省情况下是FALSE。
如下代码所示:


代码如下:

IF product_not_found THEN
RAISE_APPLICATION_ERROR(-20123, 'Invald product code', TRUE);
END IF;

--------------------------------------------------------------------------------------------------
当异常抛出后,控制无条件转到异常部分,这就意味着控制不能回到异常发生的位置,当异常被处理和解决后,控制返回到上一层执行部分的下一条语句。


代码如下:

BEGIN
DECLARE
bad_credit exception;
BEGIN
RAISE bad_credit;
--发生异常,控制转向;
EXCEPTION
WHEN bad_credit THEN
dbms_output.put_line('bad_credit');
END;
--bad_credit异常处理后,控制转到这里
EXCEPTION
WHEN OTHERS THEN
--控制不会从bad_credit异常转到这里
--因为bad_credit已被处理
END;
当异常发生时,在块的内部没有该异常处理器时,控制将转到或传播到上一层块的异常处理部分。
BEGIN
DECLARE ---内部块开始
bad_credit exception;
BEGIN
RAISE bad_credit;
--发生异常,控制转向;
EXCEPTION
WHEN ZERO_DIVIDE THEN --不能处理bad_credite异常
dbms_output.put_line('divide by zero error');
END --结束内部块
--控制不能到达这里,因为异常没有解决;
--异常部分
EXCEPTION
WHEN OTHERS THEN
--由于bad_credit没有解决,控制将转到这里
END;

(0)

相关推荐

  • oracle异常(预定义异常,自定义异常)应用介绍

    在开发过程中,经常会遇到一些测试,这时候就会想了解测试的过程,然后再根据过程分析代码错在哪里,这种情况下,就需要用到自定义异常,需要了解的朋友可以参考本文 先声明一个异常 Java代码 biz_exception exception; 再抛出来 Sql代码 复制代码 代码如下: p_RETCODE := '-1'; p_retInfo := '已生成工资+社保类型账单,请不要重复生成.'; raise biz_exception; 这样存储过程就走到最后的抓取异常地方 Sql代码 复制代码 代码

  • Oracle ORA-22908(NULL表值的参考)异常分析与解决方法

    场景如下: --创建类型(type)create or replace type list_obj is table of number;--创建表结构create table test( name varchar2(30) primary key check(regexp_like(name,'^([a-z]|[0-9]|_)+$')), id number not null, version_list list_obj) nested table version_list store as

  • Oracle9i数据库异常关闭后的启动

    正在看的ORACLE教程是:Oracle9i数据库异常关闭后的启动.Oracle shutdown的时候突然断电,导致使用sql/plus启动时无法连接到数据库,具体描述为: connection can not permitted, shut in progress. 到dos 提示符 键入: c:\> sqlplus /nolog 显示: sql/plus: Realease9.0.2--..all rights reserved sql> connect /as sysdba 显示已连接

  • 详解Oracle自定义异常示例

    1.弹出错误框: 示例代码: declare v_count number; begin select count(*) into v_count from dept; if v_count < 10 then raise_application_error(-20001,'数量小于10'); end if; end; 执行结果: 2.控制台显示: 示例代码: declare v_count number; my_exp exception; begin select count(*) into

  • Oracle 9i 数据库异常关闭后的启动

    正在看的ORACLE教程是:Oracle 9i 数据库异常关闭后的启动. Oracle 数据库启动 Oracle shutdown的时候突然断电,导致使用sql/plus启动时无法连接到数据库,具体描述为: connection can not permitted, shut in progress. 到dos 提示符 键入: c:\> sqlplus /nolog 显示: sql/plus: Realease9.0.2--..all rights reserved sql> connect 

  • win7安装oracle10g 提示程序异常终止 发生未知错误

    oracle 10g 在win7下安装,选择高级选项,提示程序异常终止,发生未知错误 修改Oracle 10G\database\stage\prereq\db\refhost.xml 在 </SYSTEM> <CERTIFIED_SYSTEMS>后面添加 <!--Microsoft Windows 7--> <OPERATING_SYSTEM> <VERSION VALUE="6.1"/> </OPERATING_SY

  • Oracle中RAISE异常深入分析

    有三种方式抛出异常 1.通过PL/SQL运行时引擎 2.使用RAISE语句 3.调用RAISE_APPLICATION_ERROR存储过程 当数据库或PL/SQL在运行时发生错误时,一个异常被PL/SQL运行时引擎自动抛出.异常也可以通过RAISE语句抛出 RAISE exception_name; 显式抛出异常是程序员处理声明的异常的习惯用法,但RAISE不限于声明了的异常,它可以抛出任何任何异常.例如,你希望用TIMEOUT_ON_RESOURCE错误检测新的运行时异常处理器,你只需简单的在

  • 索引在Oracle中的应用深入分析

    索引是提高数据查询最有效的方法,也是最难全面掌握的技术,因为正确的索引可能使效率提高10000倍,而无效的索引可能是浪费了数据库空间,甚至大大降低查询性能. 一.索引的管理成本1. 存储索引的磁盘空间2. 执行数据修改操作(INSERT.UPDATE.DELETE)产生的索引维护3. 在数据处理时所需额外的回退空间. 二.实际数据修改测试:一个表有字段A.B.C,同时进行插入10000行记录测试在没有建索引时平均完成时间是2.9秒在对A字段建索引后平均完成时间是6.7秒在对A字段和B字段建索引后

  • Oracle中游标Cursor基本用法详解

    查询 SELECT语句用于从数据库中查询数据,当在PL/SQL中使用SELECT语句时,要与INTO子句一起使用,查询的 返回值被赋予INTO子句中的变量,变量的声明是在DELCARE中.SELECT INTO语法如下: SELECT [DISTICT|ALL]{*|column[,column,...]} INTO (variable[,variable,...] |record) FROM {table|(sub-query)}[alias] WHERE............ PL/SQL

  • Oracle中PL/SQL的用法总结

    目录 一.PLSQL基本结构 1.基本数据类型变量 1. 基本数据类型 2. 基本数据类型变量的定义方法 2.表达式 1. 数值表达式 2. 字符表达式 3. 关系表达式 4. 逻辑表达式 3.PLSQL函数 4.系统输出打印 5.PL/SQL中的变量声明 二.变量赋值方式 三.PLSQL复合类型 1.记录类型record 2.表类型变量table 1. 定义一维表类型变量 2. 定义多维表类型变量 四. %type和%rowtype 五.PLSQL变量的可见空间 六.PLSQL流程控制 if判

  • Oracle中的MD5加密详解

    一.技术点 1. DBMS_OBFUSCATION_TOOLKIT.MD5 DBMS_OBFUSCATION_TOOLKIT.MD5是MD5编码的数据包函数,但偶在使用select DBMS_OBFUSCATION_TOOLKIT.MD5(input_string =>'abc') a from Dual时,却有错误提示,看来该函数只能直接在程序包中调用,不能直接应用于SELECT语句. 2.Utl_Raw.Cast_To_Raw DBMS_OBFUSCATION_TOOLKIT.MD5返回的字

  • oracle中print_table存储过程实例介绍

    定义 所谓存储过程(Stored Procedure),就是一组用于完成特定数据库功能的SQL语句集,该SQL语句集经过 编译后存储在数据库系统中.在使用时候,用户通过指定已经定义的存储过程名字并给出相应的存储过程参数 来调用并执行它,从而完成一个或一系列的数据库操作. 一直以来,觉得MySQL中使用\G参数改变输出结果集的显示方式非常好用,尤其是在命令行界面.但是ORACLE数据库没有这个功能,今天在搜索到Tom大师的一篇博文时,发现大师用一个存储过程print_table实现了类似这样的功能

  • 解决python ThreadPoolExecutor 线程池中的异常捕获问题

    问题 最近写了涉及线程池及线程的 python 脚本,运行过程中发现一个有趣的现象,线程池中的工作线程出现问题,引发了异常,但是主线程没有捕获异常,还在发现 BUG 之前一度以为线程池代码正常返回. 先说重点 这里主要想介绍 python concurrent.futuresthread.ThreadPoolExecutor 线程池中的 worker 引发异常的时候,并不会直接向上抛起异常,而是需要主线程通过调用concurrent.futures.Future.exception(timeou

  • 聊聊python中的异常嵌套

    在Python中,异常也可以嵌套,当内层代码出现异常时,指定异常类型与实际类型不符时,则向外传,如果与外面的指定类型符合,则异常被处理,直至最外层,运用默认处理方法进行处理,即停止程序,并抛出异常信息.如下代码: try: try: raise IndexError except TypeError: print('get handled') except SyntaxError: print('ok') 运行程序: Traceback (most recent call last): File

  • Oracle表字段有Oracle关键字出现异常解决方案

    一.问题由来 现在进行项目改造,数据库需要迁移,由原来的使用GBase数据库改为使用Oracle数据库,今天测试人员在测试时后台报了一个异常. 把SQL语句单独复制出来进行查询,还是报错,仔细分析原因才知道是表中的字段使用了Oracle中的关键字size. 二.问题分析 项目中使用的Oracle版本如下: 一般来说建表的时候是不会使用关键字的,可是之前的开发人员或者是数据库运维人员可能为了偷懒吧,在那张表中使用四个Oracle中的关键字, 所以导致查询的时候出现异常. 三.解决方案 找到问题的原

随机推荐