Oracle 异常处理 raise_application_error sqlcode sqlerrm

本文深入探讨Oracle中的异常处理机制,包括RAISE_APPLICATION_ERROR的过程使用、sqlcode与sqlerrm的功能介绍,以及如何处理预定义异常、用户定义异常等。通过示例展示了如何有效地管理与传播异常。

1、RAISE_APPLICATION_ERROR:用来测试的异常处理;

DBMS_STANDARD包的RAISE_APPLICATION_ERROR过程,可以重新定义异常错误消息,它为应用程序提供了一种与ORACLE交互的方法。语法如下
RAISE_APPLICATION_ERROR(errorNumber,errorString)
errorNumber是数值在-20000到-20999之间,errorString为自定义的错误信息。

里面的错误代码和内容,都是自定义的。说明是自定义,当然就不是系统中已经命名存在的错误类别,是属于一种自定义事务错误类型,才调用此函数。error_number_in 之容许从 -20000 到 -20999 之间,这样就不会与 ORACLE 的任何错误代码发生冲突。error_msg_in 的长度不能超过 2k,否则截取 2k。

如:

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!

我们都是通过dbms_output.put_line来输出异常信息,但是在实际的应用中,需要把异常信息返回给调用的客户端。
其实 RAISE_APPLICATION_ERROR 是将应用程序专有的错误从服务器端转达到客户端应用程序(其他机器上的SQLPLUS或者其他前台开发语言)
raise_application_error(异常类型,传递信息)
异常类型:number() 值域:-20000 到-20999
传递信息:varchar2(2000)

2、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。

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

BEGIN

  INSERT INTO T_TEMP VALUES ('1', '1');

EXCEPTION
  WHEN NO_BABIES_ALLOWED THEN
    -- SQLERRM 将传递给内置过程 RAISE_APPLICATION_ERROR 的消息返回
    DBMS_OUTPUT.PUT_LINE(SQLCODE);
    DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;

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;





内容概要:本文详细介绍了如何将Python深度学习模型与Django Web框架相结合,构建一个具备模型预测功能的Web应用。内容涵盖技术基础(Python深度学习与Django框架)、深度学习模型的准备(数据集处理、模型搭建与训练、评估优化)、Django项目搭建(环境配置、项目与应用创建、数据库与静态文件配置)、模型与Web的集成(模型加载、视图函数编写、URL路由配置)、前端页面设计与前后端交互实现,以及项目的本地测试与服务器部署流程。文章以图像分类为例,展示了从数据处理到模型部署的完整技术链条,强调实用性与可操作性。; 适合人群:具备Python编程基础,熟悉基本Web开发概念,有一定机器学习或深度学习经验的开发者,尤其是希望将AI模型落地为Web应用的初、中级研发人员或学生; 使用场景及目标:① 学习如何将训练好的深度学习模型(如PyTorch/CNN)集成到Web系统中;② 掌握Django框架在实际项目中的应用,包括MTV架构、视图处理、静态资源配置与前后端交互;③ 实现一个可上传数据、调用模型并展示结果的完整Web服务,并部署上线; 阅读建议:建议读者结合文中代码逐步实践,重点关注模型预处理与Django视图的衔接、前后端数据传输机制及部署配置细节,同时注意安全性和性能优化,可在本地环境调试无误后再进行服务器部署。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值