我想使用 PRAGMA INLINE 内联一个函数,但我不知道如何检查它是否按我的预期工作。 更准确地说,我有一个函数:
create or replace function my_fnc(p1 varchar2, p2 varchar2) return varchar2
is
begin
RETURN p1||p2;
end my_fnc;
...它的超载
create or replace function my_fnc(p1 varchar2, p2 varchar2, p3 varchar2) return varchar2
is
begin
RETURN p1||p2||p3;
end my_fnc;
...以及以下代码
set serveroutput on
declare
var1 varchar2(50);
var2 varchar2(50);
begin
pragma inline(my_fnc, 'YES');
select my_fnc('aaaaaaaa', 'bbbbbbbbbbb', 'ccccccccc')
, my_fnc('xxxxxxxxxxxxxxxx', 'yyyyyyyyyyyyyyyy')
into var1
, var2
from dual;
dbms_output.put_line('var1 = ' || var1 || ' / var2 = ' ||var2);
end;
我的问题是:pragma inline会以这种方式工作吗(我看到它只像
var1 := my_fnc(...)
那样使用)
如果它有效,内联将应用于两次调用还是仅应用于第一次(我看到每次调用函数时都应该解决 PRAGMA INIT 问题))
如何检查何时使用了 PRAGMA INLINING?
文档有一个示例“指定要内联重载的子程序”,内容如下:
INLINE 编译指示影响这两个函数
并且同一部分说:
如果子程序重载,则前面的编译指示适用于具有该名称的每个子程序。
然而,它也说:
子程序内联用被调用子程序的副本替换子程序调用(如果被调用子程序和调用子程序位于同一程序单元中)。
您正在从匿名块调用独立函数,而不是“同一程序单元”,因此两者都不会在此处内联。
如果您在包中定义函数,然后从同一个包中调用它们,或者在匿名块中本地定义它们,则衬里可能适用,但在您的示例中则不然。
您可以查看 PL/SQL 分层分析器 来调查您的代码是否以及如何优化。