Oracle中RAISE异常深入分析_oracle

有三种方式抛出异常
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;

时间: 2024-08-02 11:51:29

Oracle中RAISE异常深入分析_oracle的相关文章

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

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

oracle中Shared pool深入分析及性能调整

摘要:本文首先详细介绍了oracle中shared pool的概念以及所包含的内存结构.然后深入介绍了oracle对于shared pool的管理机制.最后全面介绍了有关buffer cache监控以及调优的实用方法. 1. shared pool的概念 oracle数据库作为一个管理数据的产品,必须能够认出用户所提交的管理命令(通常叫做SQL语句),从而进行响应.认出的过程叫做解析SQL语句的过程,响应的过程叫做执行SQL语句的过程.解析的过程是一个相当复杂的过程,它要考虑各种可能的异常情况,

oracle中字段异常-oracle中部分字段名称显示异常

问题描述 oracle中部分字段名称显示异常 oracle中查询出来的字段名称,部分内容显示异常,求解决 如:股? 实际应为:股东代码 如:是否 实际应为:是否强平 在线等,求大神解决..... 补充一下:用plsql查询出来,显示是没问题的,但是用sql脚本,执行,导出excel格式,就显示异常 解决方案 导出时候是否字符编码的问题.

oracle中rownum和row_number()_oracle

row_number()over(partition by col1 order by col2)表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的). 与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪劣rownum然后再进行排序,而row_number()在包含排序从句后是先排序再计算行号码. 一.oracle中rownum 用于从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字

Oracle中procedure/cursor深入分析

procedure概述 存储过程( Stored Procedure )是一组为了完成特定功能的 SQL 语句集,经编译后存储在数据库中. 用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它. 存储过程是由流控制和 SQL 语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,应用程序使用时只要调用即可. 在Oracle 中,若干个有联系的过程可以组合在一起构成程序包. procedure优点 存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般 S

Oracle中等待事件深入分析

概述 等待事件主要可以分为两类,即空闲(IDLE)等待事件和非空闲(NON-IDLE)等待事件. 1).空闲等待事件 ORACLE正等待某种工作,在诊断和优化数据库的时候,不用过多注意这部分事件. 2). 非空闲等待事件 专门针对 ORACLE 的活动,指数据库任务或应用运行过程中发生的等待,这些等待事件是 在调整数据库的时候需要关注与研究的. 在 Oracle 10g 中的等待事件可以通过 v$event_name 视图来查看等待事件的相关信息. 常见等待事件 Buffer busy wait

oracle 中 sqlplus命令大全_oracle

1.简介: Oracle的sql*plus是与oracle进行交互的客户端工具.在sqlplus中,可以运行sqlplus命令与sqlplus语句,我们通常所说的DML.DDL.DCL语句都是sqlplus语句,它们执行完后,都可以保存在一个被称为sql buffer的内存区域中,并且只能保存一条最近执行的sql语句,我们可以对保存在sql buffer中的sql 语句进行修改,然后再次执行,sqlplus一般都与数据库打交道. 2.常用命令 sqlplus username/password

如何在Oracle中导入dmp文件_oracle

项目开始拿到了dmp文件,数据库用的是10g的,但是尽然没导成功,后来想可能导出的时候用11导出的,决定试一下. 正好自己的机器是11的客户端,结果不识别imp命令,到安装目录下的bin文件夹下看尽然没有imp执行文件.可能装客户端的时候没选管理者装. 怎么办呢,从别的11的bin目录下的imp文件拷贝了一个放到了自己的bin下.执行还是出错,No message file for product = RDBMS,-- 类似这样的message,网上查了一下说拷一个[RDBMS\mesg]的内容

Oracle中的MD5加密详解_oracle

一.技术点  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返回的