oracle存储过程抛出异常之RAISE和RAISE_APPLICATION_ERROR
来源:互联网 发布:淘宝服饰 编辑:程序博客网 时间:2024/05/09 06:39
以前我们项目中存储过程里面抛出异常都是用的【RAISE E_EXCEPTION】方式,但是最近发现程序在正式环境好像出了点什么问题,老是返回些1User-defined Exception之类的结果,但是在开发环境却不会。诡异的是,相同的数据,一样的代码,返回结果却不一样。令人百思不得其解。
经过百般尝试,终于发现【RAISE_APPLICATION_ERROR】这种抛出异常的方式没有任何问题。然后就对RAISE E_EXCEPTION和RAISE_APPLICATION_ERROR进行了一次测试研究。
在多次测试和分析后发现,开发环境数据库是11.1版本,而正式环境的是11.2版本,会不会是数据库版本导致?下面就开始测试
先测试RAISE_APPLICATION_ERROR:
/*P_TEST_RAISE_EXCEPTION * 在 11.1 版本中返回 自定义的异常 * 在 11.2 版本中返回 自定义的异常 */ PROCEDURE P_TEST_RAISE_EXCEPTION(P_INVOICEIDS IN VARCHAR2, P_OPERATORID IN NUMBER, P_RESULT OUT NUMBER, P_MSG OUT VARCHAR2) AS E_EXCEPTION EXCEPTION; PRAGMA EXCEPTION_INIT(E_EXCEPTION, -20001); BEGIN FOR V_INVOICEID IN (SELECT COLUMN_VALUE AS ID FROM TABLE(PKG_FSSS_RMS_RI.F_SPLIT(P_INVOICEIDS, ','))) LOOP P_RESULT := -1; P_MSG := '自定义的异常'; RAISE_APPLICATION_ERROR(-20001, P_MSG); END LOOP; EXCEPTION WHEN E_EXCEPTION THEN P_RESULT := -1; P_MSG := P_MSG; WHEN OTHERS THEN P_RESULT := -1; P_MSG := '出错[' || SQLCODE || SQLERRM || ']'; END;
在使用RAISE_APPLICATION_ERROR抛出异常时,开发环境和正式环境都正常返回了【自定义的异常】。
接下来测试RAISE E_EXCEPTION
/*P_TEST_RAISE_APP_EXCEPTION * 在 11.1 版本中返回 自定义的异常 * 在 11.2 版本中返回 出错[1User-defined Exception] */ PROCEDURE P_TEST_RAISE_APP_EXCEPTION(P_INVOICEIDS IN VARCHAR2, P_OPERATORID IN NUMBER, P_RESULT OUT NUMBER, P_MSG OUT VARCHAR2) AS E_EXCEPTION EXCEPTION; BEGIN FOR V_INVOICEID IN (SELECT COLUMN_VALUE AS ID FROM TABLE(PKG_FSSS_RMS_RI.F_SPLIT(P_INVOICEIDS, ','))) LOOP P_RESULT := -1; P_MSG := '自定义的异常'; RAISE E_EXCEPTION; END LOOP; EXCEPTION WHEN E_EXCEPTION THEN P_RESULT := -1; P_MSG := P_MSG; WHEN OTHERS THEN P_RESULT := -1; P_MSG := '出错[' || SQLCODE || SQLERRM || ']'; END;
在 11.1 版本数据库中返回 自定义的异常
在 11.2 版本数据库中返回 出错[1User-defined Exception]
结果一下就清晰了,RAISE E_EXCEPTION时,11.1版本的oracle数据库会在WHEN E_EXCEPTION THEN中捕获该异常。而11.2版本的数据库却不会被WHEN E_EXCEPTION THEN捕获,而进了OTHER异常的捕获。所以在存储过程抛出异常时,最好使用第一种形式,虽然代码多些,但是靠谱。千万不要一时方便使用RAISE E_EXCEPTION。
0 0
- oracle存储过程抛出异常之RAISE和RAISE_APPLICATION_ERROR
- ORACLE 存储过程异常捕获并抛出
- Delphi学习之Raise(抛出异常)
- 使用RAISE_APPLICATION_ERROR抛出与oracle交互的异常
- oracle 存储过程中RAISE_APPLICATION_ERROR的作用
- oracle存储过程中RAISE_APPLICATION_ERROR用法
- oracle存储过程中RAISE_APPLICATION_ERROR用法
- oracle存储过程中RAISE_APPLICATION_ERROR用法
- python自定义异常和主动抛出异常(raise)
- 触发器|存储过程 抛出异常——>oracle
- delphi raise 语句: 抛出异常
- delphi raise 语句: 抛出异常
- Python raise 抛出异常的说明
- Oracle之异常/存储过程/函数/触发器
- Oracle存储过程---异常
- 存储过程中的when others then 和 raise 何意义?
- 存储过程中的when others then 和 raise 何意义?
- Oracle 异常处理 raise_application_error sqlcode sqlerrm
- UITextView的使用详解
- .net返回上一页的方法
- 谈谈OC的内存管理
- 通过设置静态路由来实现不同网段可以互相访问的方法
- OC编码中的理解误区和错误编码习惯
- oracle存储过程抛出异常之RAISE和RAISE_APPLICATION_ERROR
- Linux后台运行程序
- 排序方法
- 在WIN7 旗舰版下装oracle10g 详细
- MVC缓存
- 如何把一个已有的ADT项目,导入到当前的ADT中
- C++_const使用大全
- 芸儿开博客咯
- 大家进来探讨下哪门编程语言最值得学