在EXCEPTION块中使用哪些PRAGMA语句?

时间:2014-10-01 19:26:27

标签: oracle oracle11g

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

EXCEPTION
    some_operation_here();
    WHEN yaddayadda THEN
...

PL / SQL开发人员说这不是犹太人 - 哦 - 但是它的错误信息引起了我的兴趣:它期待WHENPRAGMA。我并不完全熟悉所有PRAGMA指令,但看起来它们中的任何一个都不适用于异常块,除非由于某种原因你等到这一点将错误代码绑定到异常你之前宣布过的。为什么你需要在这里使用PRAGMA指令?

2 个答案:

答案 0 :(得分:4)

一些小实验告诉我,您实际上可以在异常块中添加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,但它似乎也没有效果(在这种情况下,两行都插入了)。

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,这是我测试过的版本)没有提到在异常块中使用PRAGMA,因此它绝对没有文档记录。另一方面,它似乎不是一个特征,因为它似乎没有实际做任何事情......

  

WHEN {exception_name [OR exception_name] ... |其他}那么   声明[声明] ......

答案 1 :(得分:0)

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

declare
  yaddayadda exception;
begin
  ...
exception
  WHEN yaddayadda THEN
    some_operation_here();
end;

您需要使用pragma exception_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;