类似于 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)的主要内容,如果未能解决你的问题,请参考以下文章