oracle - EXCEPTION block 内将使用哪些 PRAGMA 语句?

标签 oracle oracle11g

我正在研究 Oracle 异常,并尝试在 EXCEPTIONWHERE 语句之间进行一些预处理。也就是说,

EXCEPTION
    some_operation_here();
    WHEN yaddayadda THEN
...

PL/SQL Developer 说这不合常理——哦好吧——但它的错误消息引起了我的兴趣:它期望 WHENPRAGMA。我并不完全熟悉所有 PRAGMA 指令,但似乎它们中的任何一个都不适用于异常 block ,除非由于某种原因您等到此时将错误代码绑定(bind)到您之前声明的异常(exception)情况。为什么您需要在此处使用 PRAGMA 指令?

最佳答案

一点实验告诉我,实际上您可以在异常 block 中放置一个 PRAGMA ,但我看不出它有多大用处。以下代码执行成功,但引发的错误触发 OTHER 部分,而不是新定义的异常部分(例如,它返回“旧异常”)。看来这是一个未记录的功能。

DECLARE
   v NUMBER;
   new_divide_zero EXCEPTION;
BEGIN
   v := 1 / 0;
EXCEPTION
   PRAGMA EXCEPTION_INIT (new_divide_zero, -1476);
   WHEN new_divide_zero THEN
      DBMS_OUTPUT.put_line ('New exception');
   WHEN OTHERS THEN
      DBMS_OUTPUT.put_line ('Old exception');
END;

类似地,我尝试将 AUTONOMOUS_TRANSACTION 放入异常 block 中,但它似乎也没有效果(在这种情况下,两行都被插入)。

CREATE TABLE test_results (result VARCHAR2 (2000));

BEGIN
   DECLARE
      v NUMBER;
      new_divide_zero EXCEPTION;
   BEGIN
      insert into test_results values ('Test Value');
      v := 1 / 0;
   EXCEPTION
      PRAGMA AUTONOMOUS_TRANSACTION;
      WHEN OTHERS THEN
         INSERT INTO test_results
         VALUES      ('Old exception');
         Commit;
   END;
   ROLLBACK;
END;

Oracle documentation (12g,这是我测试的版本)没有提到在异常 block 中使用PRAGMA,所以它绝对没有记录。另一方面,它似乎并没有什么太大的功能,因为它似乎实际上没有做任何事情......

WHEN { exception_name [ OR exception_name ]... | OTHERS } THEN statement [ statement ]...

关于oracle - EXCEPTION block 内将使用哪些 PRAGMA 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26149029/

相关文章:

windows - 入门链接在 oracle 11g 服务器中不起作用

c# - 使用 Oracle.DataAccess.Client;下载并安装 OPD.NET 后未找到

python-2.7 - 如何处理 cx_Oracle 和 python 2.7 中的 unicode 数据?

SQL:标记哪个WHERE条件匹配

visual-studio-2008 - 使用Oracle.DataClient时provider与Oracle客户端版本不兼容报错

oracle - diff 本地包与数据库包

java - 如何使用序列表

sql - 更改表添加约束时出错

sql - Oracle 中使用 TO_CHAR 进行数字格式化

oracle11g - ORA-00911: 无效字符错误