嵌套块在PL / SQL过程中是否会对性能产生影响?(Do nested blocks have any performance impact in PL/SQL procedures?)
在PL / SQL过程中,我经常将语句包装在一个块中(即开始...结束),以便我可以从该语句中隔离异常。 例如,如果我正在执行可能引发“no_data_found”的select,我可以处理该异常是由该语句引发的,但是让其他异常传播到该过程的主异常处理程序。
我想知道的是这些额外的块是否会对性能产生任何影响。 我知道引发异常会对性能产生影响,所以我从不依赖异常作为控制流机制。 但块本身是否有任何影响?
例如,如果这个性能有任何差异:
procedure do_something as declare some_var number; begin select some_value into some_var from some_table; exception when others then raise_application_error(-20000, 'Exception: ' || sqlerrm, true); end do_something;
还有这个:
procedure do_something as declare some_var number; begin begin select some_value into some_var from some_table; exception when no_data_found then some_var := -23; --some default value end; exception when others then raise_application_error(-20000, 'Exception: ' || sqlerrm, true); end do_something;
(我知道这段代码是荒谬的,但我希望它能说明我的意思!)
我真正关心的是没有引发异常时的性能 - 当出现异常时我可以接受性能下降。
In PL/SQL procedures, I often wrap statements in a block (i.e. begin...end) so that I can isolate exceptions from that statement. For example, if I'm doing a select that might raise "no_data_found", I can handle that in the knowledge that the exception was raised by that statement, but let other exceptions propagate to the main exception handler for the procedure.
What I'm wondering is if these additional blocks have any performance impact. I know raising exceptions has a performance impact, so I never rely on exceptions as a control flow mechanism. But does the block itself have any impact?
For example, should there be any difference between the performance of the this:
procedure do_something as declare some_var number; begin select some_value into some_var from some_table; exception when others then raise_application_error(-20000, 'Exception: ' || sqlerrm, true); end do_something;
and this:
procedure do_something as declare some_var number; begin begin select some_value into some_var from some_table; exception when no_data_found then some_var := -23; --some default value end; exception when others then raise_application_error(-20000, 'Exception: ' || sqlerrm, true); end do_something;
(I know this code is nonsensical, but I hope it illustrates what I mean!)
All I really care about is the performance when no exceptions are raised - I can accept performance degradation when there is an exception.
原文: