RAISE_APPLICATION_ERROR 用法

article/2025/8/26 1:33:33
可能不是很多人知道 RAISE_APPLICATION_ERROR 的用途是什么,虽然从字面上已经猜到这个函数是干什么用的。平时用来测试的异常处理
我们都是通过dbms_output.put_line来输出异常信息,但是在实际的应用中,需要把异常信息返回给调用的客户端。

其实 RAISE_APPLICATION_ERROR 是将应用程序专有的错误从服务器端转达到客户端应用程序(其他机器上的SQLPLUS或者其他前台开发语言)

RAISE_APPLICATION_ERROR 的声明:PROCEDURE RAISE_APPLICATION_ERROR( error_number_in IN NUMBER, error_msg_in IN VARCHAR2);

里面的错误代码和内容,都是自定义的。说明是自定义,当然就不是系统中已经命名存在的错误类别,是属于一种自定义事务错误类型,才调用此函数。

error_number_in 之容许从 -20000 到 -20999 之间,这样就不会与 ORACLE 的任何错误代码发生冲突。error_msg_in 的长度不能超过 2k,否则截取 2k。
举个例吧:
阻止小于18岁的用户增加到数据库 employee 表中

CREATE   OR  REPALCE  TRIGGER  minimun_age_check
BEFORE 
INSERT   ON  employee
FOR  EACH ROW
BEGIN
        
IF  ADD_MONTHS( :new.birth_date,  18 * 12 >  SYSDATE
        
THEN
               RAISE_APPLICATION_ERROR(
- 20001 ' Employees must at least eighteen years of age. ' );
        
END   IF ;
END ;

下面我们编写一个客户端程序,为了简单,同样用PL/SQL调用
DECLARE

      no_babies_allowed EXCEPTION;

       
/*将名称与用于触发器中的错误号码关联起来*/
       PRAGMA EXCEPTION_INIT(no_babies_allowed, 
- 20001 );

BEGIN

         
INSERT   INTO  employee .;

EXCEPTION
         
WHEN  no_babies_allowed
         
THEN
                
/*
                || SQLERRM 将传递给内置过程 RAISE_APPLICATION_ERROR 的消息返回
                
*/

                DBMS_OUTPUT.PUT_LINE(SQLERRM);
END ;


平时用来测试的异常处理
我们都是通过dbms_output.put_line来输出异常信息,但是在实际的应用中,需要把异常信息返回给调用的客户端。
其实 RAISE_APPLICATION_ERROR 是将应用程序专有的错误从服务器端转达到客户端应用程序(其他机器上的SQLPLUS或者其他前台开发语言)

raise_application_error(异常类型,传递信息)

异常类型:number() 值域:-20000 到-20999

传递信息:varchar2(2000)

DBMS_STANDARD包的RAISE_APPLICATION_ERROR过程,可以重新定义异常错误消息,它为应用程序提供了一种与ORACLE交互的方法。语法如下

RAISE_APPLICATION_ERROR(errorNumber,errorString)

errorNumber是数值在-20000到-20999之间,errorString为自定义的错误信息。

如:

update jobs set job_title = v_newJobTitle where job_id = v_jobid;

if sql%notfound then

   RAISE_APPLICATION_ERROR(-20167,'update failure!');

end if;

..........

当在sqlpus中测试时,一旦没有要更新的行,则抛出这样的异常:

ORA-20167: update failure!

oracle的异常分为编译时异常(错误)和运行时异常,前者不能被处理,后者可以被处理。
我们主要讨论运行时异常。

异常类型:
a、预定义异常
      已命名的预定义异常有CURSOR_ALREADY_OPEN、INVALID_NUMBER、TOO_MANY_ROWS等
b、用户定义异常
c、已命名异常(已命名异常不能单独归为一类异常,但它有点特别,所以我将它单独罗列说明)
      如果希望处理一个异常(被when子串处理),那么异常必须有一个名字,如TOO_MANY_ROWS;
      数据库错误有数千个,但是只有不到25个是内建的已命名异常(这些异常都声明在standard包中);
      要处理那些未命名的异常时,你可以将一个名字和一个错误号联系在一起,达到这个目的的语句是pragma exception_init语句;

抛出异常:
a、通过pl/sql运行时引擎
      当数据库或pl/sql在运行时发生错误时,一个异常被pl/sql运行时引擎自动抛出
b、使用raise语句
      异常也可以通过raise语句抛出:raise exception_name;
c、调用raise_application_error存储过程

处理异常&异常传播:
a、一旦程序进入异常部分就不能再回到同一块的执行部分;当异常被处理后,控制返回到外层执行部分的下一条语句;
b、如果有when others子串,则必须放置在最后面作为缺省处理器处理没有显式处理的异常;
c、执行部分抛出的异常将首先传递到同一块的异常部分,如果在同一块的异常部分没有处理这个异常的处理器,那么异常将会传播到上一层的异常部分中,一直到最外层;
d、异常被处理后如果你仍然希望它继续传播,可以在异常处理的最后执行不带参数的raise语句(raise语句将重新抛出出现的异常,允许它继续传播);

--这是一个上面部分知识点的示例(伪代码)说明
declare
...
user_define_exception exception; --用户定义异常
invalid_column_name exception;
--补充说明:如果我们在程序块中使用了无效列名,会有括号中的错误提示(ORA-00904:invalid column name)
--下面我们将这个异常代码号与我们自定义的异常进行关联,即为异常命名
pragma exception_init(invalid_column_name,-904);
begin
...
--raise user_define_exception; --可以显式引发异常
exception
when TOO_MANY_ROWS then --预定义异常处理
    ...;
when user_define_exception then --用户定义异常处理
    ...;
when invalid_column_name then --PRAGMA EXCEPTION_INIT异常处理
    ...;
    raise;    --继续传播该异常
end;

sqlcode和sqlerrm:
a、另外一种处理数据库错误的方法是使用内建函数sqlcode和sqlerrm;
b、sqlcode将返回现行数据库错误号,这些错误号中除了no_data_found是+100外其他都是负数;
c、sqlerrm返回文本描述的错误信息;
d、为了获得用户自定义异常返回的sqlerrm和sqlcode,你需要使用raise_application_error函数给自定义异常标注错误号

给自定义错误标注号码:
a、raise_application_error内建函数用于抛出一个异常并给异常赋予一个错误号以及错误信息;
b、自定义异常的缺省错误号是+1,缺省信息是user_defined_exception。来自未处理的异常的一般信息对于识别导致错误的原因没有帮助,
c、raise_application_error函数能够在pl/sql程序块的执行部分和异常部分调用,显式抛出带特殊错误号的命名异常;
d、使用语法:raise_application_error(error_no,error_message[,{true|| false}]);
e、错误号的范围是-20,001到-20,999;错误信息是文本字符串,最多为2048字节;true和false表示是添加(true)进错误堆(error stack)还是覆盖(overwrite)错误堆(false)。缺省情况下是false。






http://chatgpt.dhexx.cn/article/Exx6hTCp.shtml

相关文章

RAISERROR 的用法(转)

raiserror 的作用: raiserror 是用于抛出一个错误。[ 以下资料来源于sql server 2005的帮助 ] 其语法如下: RAISERROR ( { msg_id | msg_str | local_variable } { ,severity ,state } [ ,argument [ ,...n ] ] ) [ WITH option…

raiserror的用法

描述:raiserror :是用于抛出一个错误 第一个参数:{ msg_id | msg_str | local_variable } msg_id:表示可以是一个sys.messages表中定义的消息代号; 使用 sp_addmessage 存储在 sys.messages 目录视图中的用户定义错误消…

strerror函数

strerror是一个库函数,这个函数的功能就是将errno转换为方便我们理解的字符串信息。我们可以在linux终端命令行中输入“man 3 strerror”来查看这个库函数的详细信息,如下图所示。 从上图我们可以知道,该库函数的原型是:char *st…

SystemError: initialization of _internal failed without raising an exception

运行mmdetection3d时报错: 原因: numba和numpy版本不匹配 解决方法: 降低numpy的版本(由于mmdet3d限制了numba的版本)pip install numpy1.23.1 -i https://pypi.tuna.tsinghua.edu.cn/simple

RAISEERROR

raiserror 的作用 : raiserror 是用于抛出一个错误。[ 以下资料来源于sql server 2005的帮助 ] 其语法如下: RAISERROR ( { msg_id | msg_str | local_variable } { ,severity ,state } [ ,argument [ ,...n…

RAISE_APPLICATION_ERROR用法

 RAISE_APPLICATION_ERROR用法 Posted on 2008-03-30 11:25 CaizhanshusBlog 阅读( 35132) 评论( 0) 编辑 收藏 可能不是很多人知道 RAISE_APPLICATION_ERROR 的用途是什么,虽然从字面上已经猜到这个函数是干什么用的。平时用来测试的异…

RAISERROR用法

来源http://msdn.microsoft.com/zh-cn/library/ms177497.aspx RAISERROR 用于将与 SQL Server 数据库引擎生成的系统错误或警告消息使用相同格式的消息返回到应用程序中。 RAISERROR 还可以返回: 已通过 sp_addmessage 系统存储过程创建的用户定义的错误消息。这…

SQL Server研习录(23)——RAISERROR()函数

SQL Server研习录(23)——RAISERROR函数 版权声明一、RAISERROR()函数1、基本语法 版权声明 本文原创作者:清风不渡博客地址:https://blog.csdn.net/WXKKang 一、RAISERROR()函数 概念:生成错误消息并启动会话的错误处…

秒懂SQL SERVERE 数据库中RAISERROR的基本用法

基本用法 raiserror(msg,severity,state)一、msg 错误信息。 二、severity 错误信息的级别,我们可以指定 0 到 18 之间的严重级别。 只有 sysadmin 固定服务器角色成员或具有 ALTER TRACE 权限的用户才能指定 19 到 25 之间的严重级别。若要使用 19 到 25 之间的严…

国产化DSP方案引领VoIP产业全面升级

国内VoIP产业已经是一个发展了20多年的成熟产业链。稳定的客户群体,十几年不变的进口DSP方案,大同小异的产品形态,近几年罕有创新产品诞生。2019年6月1日绅聚科技推出重磅产品–全国产DSP芯片解决方案–A1010,将引领VoIP产业进行全…

A1006

#include <stdio.h>struct pNode{char id[20];int hh,mm,ss; }ans1,ans2, temp;bool great(pNode node1, pNode node2){ //时间node1 大于node2 返回真if (node1.hh ! node2.hh) return node1.hh>node2.hh;if (node1.mm ! node2.mm) return node1.mm>node2.m…

A1010 Radix (25 分)PAT甲级真题(C++)【进制转换】题目详解 测试点分析

Given a pair of positive integers, for example, 6 and 110, can this equation 6 110 be true? The answer is yes, if 6 is a decimal number and 110 is a binary number. Now for any pair of positive integers N1​ and N2​, your task is to find the radix of on…

汇编踩过的坑(error A1010,A2085 ,divide error,A2070,注意事项)

汇编踩过的坑&#xff08;error A1010&#xff0c;A2085 &#xff0c;divide error&#xff0c;A2070&#xff0c;注意事项&#xff09; 最近也是在学汇编语言&#xff0c;上机的时候发现错误很不友好&#xff0c;总是断断续续&#xff0c;上网去查询&#xff0c;又查不到&…

【PAT甲级】A1001-A1050刷题记录

文章目录 A1001 AB Format (20 分) 0.25★(一元多项式加法) A1002 AB for Polynomials (25 分) 0.21(单源最短路Dijkstra边权第二标尺(点权)最短路数目) A1003 Emergency (25 分) 0.28(静态树层次遍历) A1004 Counting Leaves (30 分) 0.35A1005 Spell It Right (20 分) 0.34A1…

绅聚科技推出首款国产化VoIP专用芯片A1010

近20年来我国VoIP产业一直处于蓬勃发展之中&#xff0c;但是最核心的语音融合处理芯片&#xff08;DSP&#xff09;一直是被进口芯片方案所占据&#xff0c;VoIP产品全国产化一直无法实现。2019年6月1日绅聚科技推出了中国首家自主知识产权的中低密度语音融合处理芯片——A1010…

机房收费系统---详细设计说明书

详细设计说明书 1引言 1.1编写目的 说明编写这份详细设计说明书的目的&#xff0c;指出预期的读者。 该文档是在概要设计的基础上&#xff0c;进一步的细化系统结构&#xff0c;展示了软件结构的图表&#xff0c;物理设计&#xff0c;数据结构设计&#xff0c;以及算法设计…

概要设计说明书【校园BBS论坛-附源码】2022-5.5

信息系统分析与设计——系列文章 一、《软件项目开发计划【列文】2022.5.11》 二、《GB&#xff0d;软件需求说明书【列文】2022-5.6》 三、《需求分析文档——适用范围&#xff1a;产品规划经理进行需求分析》 四、《开发进度月报【列文】2022.5.11》 五、《可行性研究报告【列…

数据库课程设计 论坛系统—— 系统详细设计说明书

马马虎虎记录下2021Fall 的数据库课程设计——论坛系统 基于django开发&#xff0c;源码上传到github啦:) &#x1f517; B612Forum 不能翻墙的戳这里:) csdn资源下载 文章目录 1. 文档介绍1.1. 编写目的1.2. 文档范围1.3. 读者对象 2. 数据库概念结构设计2.1 系统 ER 图2.2 系…

【软件工程】机房文档--详细设计说明书

详细设计说明书 1引言 1.1编写目的 现在机房里提供的办公服务不断增加&#xff0c;信息不断的发展&#xff0c;单靠人工管理已经远远不能应付&#xff0c;这就要求办公自动化系统必须实现自动化、集成化。充分利用计算机网络优势&#xff0c;提高办公效率&#xff0c;是机房…

05详细设计说明书

详细设计说明书 1引言 1.1编写目的 本阶段在用户的需求分析的基础上&#xff0c;对机房收费系统做出概要设计。 编制的目的是说明对程序系统的设计考虑&#xff0c;包括程序系统的基本处理流程、程序系统的组织结构、模块划分、功能分配、接口设计、运行设计、数据结构设计…