Oracle 在异常块中会使用哪些PRAGMA语句?

Oracle 在异常块中会使用哪些PRAGMA语句?,oracle,oracle11g,Oracle,Oracle11g,我在玩Oracle异常,并尝试在EXCEPTION和WHERE语句之间进行一些预处理。就是 EXCEPTION some_operation_here(); WHEN yaddayadda THEN ... PL/SQL开发人员说这不是犹太教——哦,好吧——但它的错误消息引起了我的兴趣:它期望WHEN或PRAGMA。我并不完全熟悉所有的PRAGMA指令,但它们似乎都不适用于异常块,除非出于某种原因,您一直等到现在才将错误代码绑定到先前声明的异常。为什么在这里需要使用PRAGMA

我在玩Oracle异常,并尝试在
EXCEPTION
WHERE
语句之间进行一些预处理。就是

EXCEPTION
    some_operation_here();
    WHEN yaddayadda THEN
...

PL/SQL开发人员说这不是犹太教——哦,好吧——但它的错误消息引起了我的兴趣:它期望
WHEN
PRAGMA
。我并不完全熟悉所有的
PRAGMA
指令,但它们似乎都不适用于异常块,除非出于某种原因,您一直等到现在才将错误代码绑定到先前声明的异常。为什么在这里需要使用
PRAGMA
指令?

这是语法错误。要捕获异常,必须使用以下语法:

declare
  yaddayadda exception;
begin
  ...
exception
  WHEN yaddayadda THEN
    some_operation_here();
end;
您需要使用
pragma exception\u Init
为您分配带有sql错误代码的自定义异常。 例如:

declre
  l_id number;
  e_resource_busy        EXCEPTION;
  PRAGMA EXCEPTION_INIT(e_resource_busy, -54);
begin
   select id
     into l_id
     from job_table
    where status = 'RUNNING'
      for update nowait;
exception
  WHEN e_resource_busy THEN
     -- row is locked
    some_operation_here();
end;

一个小实验告诉我,事实上,你可以在异常块中放置一个
PRAGMA
,但我看不出它有什么用处。以下操作成功执行,但引发的错误会触发
OTHER
部分,而不是新定义异常的部分(例如,它返回“Old exception”)。这似乎是一个未记录的功能

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;

类似地,我尝试将一个
自治_事务
放在异常块中,但它似乎也没有效果(在本例中,两行都被插入)


(12g,这是我测试这个的版本)没有提到在异常块中使用
PRAGMA
,所以它肯定没有文档记录。另一方面,它似乎不是什么功能,因为它实际上似乎什么都没有做

当{exception_name[或exception_name]…| OTHERS}时 声明[声明]


神秘的也许他们只是在他们的编译器中为假设的概念留出了空间,即未来的新布拉格将在那里有用。我会在一两天内接受这个答案,如果没有人不同意“嗯,我也不知道。”我有一个理论,这是从Ada继承的语法,因为那是PL/SQL的模型。但是,我也找不到任何证据表明Ada允许在异常块中使用
pragma
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;