`
Copperfield
  • 浏览: 260224 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
C407adc3-512e-3a03-a056-ce4607c3a3c0
java并发编程陷阱
浏览量:25137
社区版块
存档分类

RAISE_APPLICATION_ERROR--oralce学习笔记之异常处理篇

阅读更多

 

平时用来测试的异常处理
我们都是通过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。

分享到:
评论

相关推荐

    Oracle中RAISE异常深入分析

    Oracle提供了多种方式来处理和抛出异常,包括由PL/SQL运行时引擎自动抛出、使用`RAISE`语句显式抛出,以及调用`RAISE_APPLICATION_ERROR`存储过程。 1. **通过PL/SQL运行时引擎抛出异常**: 这是最常见的异常处理...

    ORACLE_PlSql-甲骨文学习笔记

    RAISE_APPLICATION_ERROR(-20001, '年龄不能为负数'); END IF; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('发生错误: ' || SQLERRM); END; ``` ##### 7 存储过程 存储过程是在数据库中存储的一组预编译...

    oracle异常处理

    Oracle 异常处理是 PL/SQL 编程中不可或缺的一部分,它允许开发者优雅地处理程序运行时遇到的各种错误。在 PL/SQL 中,异常处理主要分为预定义异常、非预定义异常以及自定义异常。 预定义异常是 Oracle 为常见错误...

    Oracle_存储过程exception异常处理大全及实例经典最终.docx

    例如,RAISE_APPLICATION_ERROR(-20001, 'Error message'); 结论 ---- Oracle 存储过程 exception 异常处理大全及实例经典最终是 Oracle 数据库中存储过程的异常处理机制,可以捕捉和处理错误,以确保程序的正确...

    异常处理的相关知识与实例

    - 当员工编号不在7000到8000之间时,将通过调用`RAISE_APPLICATION_ERROR`函数触发异常,并提供具体的错误信息。 ### 总结 通过上述示例,我们可以看到异常处理在Oracle PL/SQL中的应用非常广泛。合理利用异常处理...

    oracle异常总结

    Oracle 异常处理是 PL/SQL 编程中不可或缺的一部分,它允许开发者优雅地处理运行时错误,确保程序的稳定性和可维护性。在Oracle数据库中,异常分为预定义异常、非预定义异常和自定义异常。 预定义异常是Oracle为...

    ORACLE-基于包的存储过程动态分页

    RAISE_APPLICATION_ERROR(-20001, '表名不能为空'); END IF; -- 默认查询所有列 IF TRIM(VAR_TABLECOLUMN) IS NOT NULL THEN V_TABLECOLUMN := VAR_TABLECOLUMN; ELSE V_TABLECOLUMN := '*'; END IF; -- ...

    详解Oracle自定义异常示例

    `raise_application_error`函数允许我们在程序中抛出具有负数异常号的用户定义错误,这些异常号通常在-20000到-20999之间,以避免与Oracle预定义的异常号冲突。 在实际开发中,自定义异常能够帮助我们提供更精确的...

    linux-c-api-ref.zip_linux api_linux-c-api-ref

    4. **信号处理**:信号是进程间通信的一种方式,`signal()`或`sigaction()`用于注册信号处理函数,`raise()`发送信号给当前进程,`kill()`向指定进程发送信号。 5. **内存管理**:`malloc()`和`free()`负责动态内存...

    Oracle PLSQL入门之案例实践

    RAISE_APPLICATION_ERROR(-20001, '发生错误: ' || SQLERRM); END test_add_salary; -- 测试方法: 验证薪资变动记录 PROCEDURE test_salary_log IS BEGIN -- 更新薪资 UPDATE emp SET emp_salary = 5000 ...

    在Oracle运行操作系统命令

    RAISE_APPLICATION_ERROR(-20010, 'execute_system: Error while sending. Status=' || status); END IF; status := DBMS_PIPE.RECEIVE_MESSAGE(pipe_name, timeout); IF status <> 0 THEN RAISE_APPLICATION...

    oracle中修改用户密码复杂度的具体例子及操作过程(unix中)

    raise_application_error(-20003, 'Password should contain at least one digit, one character and one punctuation'); END IF; -- 2. Check for the character <<findchar>> ischar:=FALSE; FOR i IN 1.....

    Oracle使用配置文件创建口令管理策略

    RAISE_APPLICATION_ERROR(-20003, '口令必须包含至少一个大写字母'); ELSIF NOT REGEXP_LIKE(password, '[0-9]') THEN RAISE_APPLICATION_ERROR(-20004, '口令必须包含至少一个数字'); ELSE RETURN TRUE; END ...

    Oracle 异常处理

    RAISE_APPLICATION_ERROR(-20001, '自定义错误信息'); END IF; EXCEPTION WHEN OTHERS THEN -- 错误处理 END; ``` ### 异常处理的最佳实践 1. **捕获并处理必要的异常**:避免捕获所有异常(`WHEN OTHERS THEN...

    ORACLE 异常错误处理

    ### ORACLE 异常错误处理详解 #### 一、异常处理概述 在ORACLE数据库的开发过程中,无论是多么复杂的业务逻辑还是简单的数据操作,都不可避免地会遇到各种异常情况。有效的异常处理机制不仅可以帮助开发者更好地...

    PL_SQL中的异常处理方法研究.pdf

    用户可以创建自定义异常,通常使用RAISE或RAISE_APPLICATION_ERROR过程引发。自定义异常是通过在异常处理部分使用RAISE语句并指定异常名称来触发的。 5. RAISE_APPLICATION_ERROR使用 RAISE_APPLICATION_ERROR是一...

    oracle触发器案例

    - **错误处理**:若为非工作日,则通过 `RAISE_APPLICATION_ERROR` 抛出错误,阻止 DML 操作执行。 #### 案例二:区分不同操作类型的工作日限制 **目标**:对于 EMP 表,在非工作日时,根据不同的 DML 操作抛出...

    oracle自定义异常

    #### 一、Oracle异常处理机制简介 在Oracle PL/SQL编程中,异常处理是一项非常重要的功能。它可以帮助开发者捕获并处理程序运行时可能发生的错误情况,确保应用程序能够稳定可靠地运行。Oracle PL/SQL支持多种类型...

    ORACLE游标与异常处理

    阅读提供的文档如《Oracle+PLSQL语言入门》、《Oracle数据库PL-SQL学习资料之五——异常处理》和《oracle存储过程中的异常处理》,可以进一步深入学习这些概念并提升您的Oracle数据库编程技能。

Global site tag (gtag.js) - Google Analytics