Oracle嵌套块和异常处理

red*_*ost 5 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; 
Run Code Online (Sandbox Code Playgroud)

答案说输出将是"外部块",有人可以解释为什么内部块不会被执行吗?oracle中异常的优先级是什么?

Ada*_*rsh 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;
Run Code Online (Sandbox Code Playgroud)

有关嵌套异常块的更多信息,请阅读此处.