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;
/