类似于 Oracle PL/SQL 块中的 finally Block (JAVA)

Posted

技术标签:

【中文标题】类似于 Oracle PL/SQL 块中的 finally Block (JAVA)【英文标题】:Similar to finally Block (JAVA) in Oracle PL/SQL Block 【发布时间】:2017-11-23 07:36:09 【问题描述】:

在 Java 中,finally 块在所有条件下都执行。

Oracle PL/SQL 中是否有任何类似的函数,只要过程完成执行,即使使用了 return 语句也会执行?

【问题讨论】:

与 Java 不同,PL/SQL 不支持 FINALLY 部分。但是,您可以模仿本节的大部分内容。检查这个oracle.com/technetwork/testcontent/o19plsql-085133.html和这个stevenfeuersteinonplsql.blogspot.com/2017/01/… 【参考方案1】:

没有 FINALLY 的等价物,但您可以使用嵌套的 PL/SQL 块来模拟它;

DECLARE
  -- Your variables.
  return_early BOOLEAN := FALSE;
BEGIN
  -- Do something

  DECLARE
    -- Local variables in "try" block
  BEGIN 
    -- Equivalent of "try" block
    -- Do something that may raise an exception
    IF some_condition THEN
      return_early := TRUE;
      -- you could also use "GOTO end_try;" rather than surrounding the
      -- following statements in an "ELSE" statement
    ELSE
      -- Do something else that may raise an exception
    END IF;
  EXCEPTION
    WHEN your_exception THEN
      -- Equivalent of "catch" block
  END;
  <<end_try>>
  -- Handle "finally" here, after end of nested block.
  -- Note: you can only see variables declared in this outer block
  --       not variables local to the nested PL/SQL block.
  IF return_early THEN
    RETURN;
  END IF;

  -- Continue and do more stuff.
END;
/

【讨论】:

如果在“try”块中引发未处理的异常,这个“finally”部分将不会运行。 @DavidBalažic 如果您对此感到担心,请将WHEN OTHERS THEN ... 添加到异常处理块中以处理其他未捕获的异常。【参考方案2】:

*** 上的另一个帖子可以在这里提供帮助:Exception handling in pl/sql

Tony 说:

"您可以创建嵌套块:"

create or replace procedure Trial
    is 
Begin
  begin
    ---Block A--
  EXCEPTION
    when others then
      insert into error_log values('error');
  end;
  begin
    --Block B ----
  end;
end;

【讨论】:

【参考方案3】:

您可以创建一个自定义异常,然后在其他异常结束时引发它,此自定义异常必须位于外部块上:

BEGIN
    BEGIN
     --DO SOME CODE HERE
    EXCEPTION 
      WHEN NO_DATA_FOUND THEN
        --HANDLE EXCEPTION
        RAISE CUSTOM_EXCEPTION;
    END;
EXCEPTION
    WHEN CUSTOM_EXCEPTION THEN
      --HANDLE THE FINALLY CODE HERE
END;

【讨论】:

以上是关于类似于 Oracle PL/SQL 块中的 finally Block (JAVA)的主要内容,如果未能解决你的问题,请参考以下文章

pl/sql 块中的子选择上的 Oracle 8i 动态 SQL 错误

Oracle 匿名 PL/SQL 块中缺少关键字错误

为啥在匿名 PL/SQL 块中没有立即引发异常?

PL/SQL基础知识结构

从 oracle PL/SQL 查看变量的值

从 pl/sql 异常块中“一次”关闭所有游标