Oracle嵌套块和异常处理

时间:2013-11-26 13:10:15

标签: oracle plsql oracle11g

DECLARE
    string_of_5_chars VARCHAR2(5);
BEGIN
    BEGIN
        string_of_5_chars := 'Steven';
    EXCEPTION
        WHEN value_error THEN
          RAISE no_data_found;
        WHEN no_data_found THEN
          dbms_output.Put_line ('Inner block');
    END;
EXCEPTION
    WHEN no_data_found THEN
      dbms_output.Put_line ('Outer block');
END; 

答案说输出将是“外部块”,有人可以解释为什么内部块不会被执行吗? oracle

中异常的优先级是什么

3 个答案:

答案 0 :(得分:9)

DECLARE
string_of_5_chars VARCHAR2(5);
BEGIN
BEGIN
    string_of_5_chars := 'Steven';  -- Varchar has a size of 5 defined above. So it will throw a value_error(due to size constraints) exception.
EXCEPTION
    WHEN value_error THEN    -- This exception block will handle the error thrown above.
      RAISE no_data_found;   -- It raises a no_data _found exception which by rule has to be handled in the outer exception block. So it goes to the outer exception block.
    WHEN no_data_found THEN
      dbms_output.Put_line ('Inner block');
END;
EXCEPTION
WHEN no_data_found THEN
  dbms_output.Put_line ('Outer block'); -- Exception is handled here which causes it to print 'Outer Block'
END;

阅读here以获取有关嵌套异常块的更多信息。

答案 1 :(得分:2)

您应该将异常块的WHEN子句视为与常规CASE语句类似。执行匹配条件的第一个WHEN,并跳过该异常处理程序中的以下WHEN子句。

因此,内部异常块中的第二个WHEN子句根本不在代码执行路径中,外部异常块捕获由嵌套异常的第一个WHEN子句引发的no_data_found错误。

此方案中的异常传播在此解释:http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/errors.htm#LNPLS00706

答案 2 :(得分:0)

string_of_5_chars := 'Steven';引发value_error时,会输入相应的异常块 在异常块内部引发no_data_found异常。由于提升部分,此异常由外部块的异常处理处理。

有关详细信息,请查看http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/raise_statement.htm