Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle PL/SQL:捕获编号异常?_Oracle_Exception_Plsql - Fatal编程技术网

Oracle PL/SQL:捕获编号异常?

Oracle PL/SQL:捕获编号异常?,oracle,exception,plsql,Oracle,Exception,Plsql,下面是捕获命名异常的规范方法 begin select ...; exception when zero_divide then ... end; 如何捕获已编号的异常?我可以在一个when子句中指定几个例外条件吗 ORA-01555: snapshot too old: ... ORA-08180: no snapshot found based on specified time ORA-01466: unable to read data -

下面是捕获命名异常的规范方法

  begin
      select ...;
  exception
  when zero_divide then
        ...
  end;
如何捕获已编号的异常?我可以在一个when子句中指定几个例外条件吗

ORA-01555: snapshot too old: ...
ORA-08180: no snapshot found based on specified time
ORA-01466: unable to read data - table definition has changed

一种可能的方法是在其他处理程序和内部检查sqlerrm(sqlcode)时编写一个


首先,下面我们要说:

通过
PRAGMA exception_INIT
,每个异常只能与一个错误代码关联, 对于同一个异常,许多pragma声明没有获得编译错误,但是最新的pragma覆盖了以前的所有pragma声明。 因此,我们没有自然的(或本机的)PL/SQL方法将多个异常代码合并到一个异常名称下,以便能够 用
当我的异常出现时

因此,当我们想同时捕获许多异常时,别无选择,只能输入
当其他异常出现时,再输入
部分并执行一些技巧(仅限于想象力)。这里没有秘密——我们必须处理
sqlcode
函数,所以让我们把它做得漂亮一些,并尝试封装这些东西

可能的解决方案之一:
创建布尔函数,用于检查错误代码(可能还有错误消息),并在
CASE TRUE…
中使用它们作为保护

CREATE OR REPLACE PACKAGE exc_filter IS 
  FUNCTION exception_kind_A RETURN boolean;
  FUNCTION exception_kind_B RETURN boolean;
  FUNCTION exception_kind_C RETURN boolean;
END;
/

CREATE OR REPLACE PACKAGE BODY exc_filter IS  

  -- I use negation of sqlcode to reduce noice of minuses.

  FUNCTION exception_kind_A RETURN boolean is BEGIN
    RETURN -sqlcode IN (01476, 06502);
  END;

  FUNCTION exception_kind_B RETURN boolean IS BEGIN
    RETURN -sqlcode BETWEEN 20010 AND 20020;
  END;

  -- a bit of discouraging flexibility
  FUNCTION exception_kind_C RETURN boolean IS BEGIN
    RETURN instr(sqlerrm, 'Yay') > 0;
  END;
END;
/

DECLARE
  x number; 
BEGIN
   -- each line raises an error - uncomment to try

   x := 5/0;

   -- raise_application_error(-20008, 'Yay');

   -- raise_application_error(-20015, 'Another');

   -- x := to_number('abc');

EXCEPTION WHEN OTHERS THEN -- catch all, then switch
  CASE TRUE
  WHEN exc_filter.exception_kind_A THEN dbms_output.put_line('Kind A : ' || sqlerrm);
  WHEN exc_filter.exception_kind_B THEN dbms_output.put_line('Kind B : ' || sqlerrm);
  WHEN exc_filter.exception_kind_C THEN dbms_output.put_line('Kind C : ' || sqlerrm);
  ELSE raise; -- strongly recommended line
  END CASE; 
END;
/

使用
异常\u INIT Pragma
,有关详细信息和示例,请参阅此链接:。另请参见此链接:了解处理异常的基本知识。您可以指定多个异常处理程序,只需在。。然后。。什么时候然后..
等等。就我记忆所及,它不会有
ORA-01555
的值,只有
-1555
的数值。这是真的,我的错。嗯。。您的语法肯定是非PL/SQL的。但总体来说,这个想法还不错。是的,过去6个月我一直在用Java编写代码。我将牢记遵循plsql语法,并尝试在下次发布语法正确的逻辑。
CREATE OR REPLACE PACKAGE exc_filter IS 
  FUNCTION exception_kind_A RETURN boolean;
  FUNCTION exception_kind_B RETURN boolean;
  FUNCTION exception_kind_C RETURN boolean;
END;
/

CREATE OR REPLACE PACKAGE BODY exc_filter IS  

  -- I use negation of sqlcode to reduce noice of minuses.

  FUNCTION exception_kind_A RETURN boolean is BEGIN
    RETURN -sqlcode IN (01476, 06502);
  END;

  FUNCTION exception_kind_B RETURN boolean IS BEGIN
    RETURN -sqlcode BETWEEN 20010 AND 20020;
  END;

  -- a bit of discouraging flexibility
  FUNCTION exception_kind_C RETURN boolean IS BEGIN
    RETURN instr(sqlerrm, 'Yay') > 0;
  END;
END;
/

DECLARE
  x number; 
BEGIN
   -- each line raises an error - uncomment to try

   x := 5/0;

   -- raise_application_error(-20008, 'Yay');

   -- raise_application_error(-20015, 'Another');

   -- x := to_number('abc');

EXCEPTION WHEN OTHERS THEN -- catch all, then switch
  CASE TRUE
  WHEN exc_filter.exception_kind_A THEN dbms_output.put_line('Kind A : ' || sqlerrm);
  WHEN exc_filter.exception_kind_B THEN dbms_output.put_line('Kind B : ' || sqlerrm);
  WHEN exc_filter.exception_kind_C THEN dbms_output.put_line('Kind C : ' || sqlerrm);
  ELSE raise; -- strongly recommended line
  END CASE; 
END;
/