内联函数

问题描述 投票:0回答:1

我想使用 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?

sql oracle plsql inline
1个回答
0
投票

文档有一个示例“指定要内联重载的子程序”,内容如下:

INLINE 编译指示影响这两个函数

并且同一部分说:

如果子程序重载,则前面的编译指示适用于具有该名称的每个子程序。

然而,它也说:

子程序内联用被调用子程序的副本替换子程序调用(如果被调用子程序和调用子程序位于同一程序单元中)。

您正在从匿名块调用独立函数,而不是“同一程序单元”,因此两者都不会在此处内联。

如果您在包中定义函数,然后从同一个包中调用它们,或者在匿名块中本地定义它们,则衬里可能适用,但在您的示例中则不然。

您可以查看 PL/SQL 分层分析器 来调查您的代码是否以及如何优化。

© www.soinside.com 2019 - 2024. All rights reserved.