【问题标题】:How to call a pl/sql anonymous block from an pl/sql anonymous block如何从 pl/sql 匿名块调用 pl/sql 匿名块
【发布时间】:2014-09-30 16:05:38
【问题描述】:

我有以下 PL/SQL 块,它工作正常。我想从另一个 PL/SQL 块调用这个函数 (TimeToFrame)。

我无法在存储在数据库中的过程或包中声明此函数。换句话说,我如何从另一个 pl/sql 调用 pl/sql,其中 pl/sql 都是匿名块??

如果我将该函数放在一个单独的 .sql 文件中会怎样。我不能从我的匿名块中调用那个 .sql 文件并传递一些 IN 参数并让那个 fct 返回 OUT 参数吗?

Declare
nTime Number;

FUNCTION TimeToFrame(pTime IN Varchar2)
return NUMBER IS
nTime NUMBER;
BEGIN
select (SUBSTR(pTime, 1, 2) * 108000)+(SUBSTR(pTime, 4, 2) * 1800)+(SUBSTR(pTime, 7, 2)     * 30)+SUBSTR(pTime, 10, 2)
 into nTime
 from dual;
 return nTime;
END TimeToFrame;

Begin
nTime:=TimeToFrame('47:59:59:29');
DBMS_OUTPUT.PUT_LINE(nTime);
End;

【问题讨论】:

标签: oracle plsql


【解决方案1】:

不幸的是,没有办法做到这一点。在匿名块中声明的嵌套子程序在匿名块被处理后甚至不会被持久化,因此即使我们忽略范围限制,当处理另一个匿名块时它不存在

如果由于邪恶的 DBA 不允许而无法将其设为存储函数,则必须复制粘贴该函数。

【讨论】:

  • 如果我将该函数放在单独的 .sql 文件中。我不能从我的匿名块中调用那个 .sql 文件并传递一些 IN 参数并让那个 fct 返回 OUT 参数吗?
  • 没有。匿名块在数据库中执行,很可能无权访问文件(即使有,也没有简单的方法来加载和执行它)。
【解决方案2】:

关键是如果你有一个 PL/SQL 匿名块,你不能识别和调用它,因为它是匿名的。你必须编译这个存储过程,然后从你的 PL/SQL 块中调用它

【讨论】:

    【解决方案3】:

    根据您的评论和问题编辑,如果您的匿名块作为 SQL*Plus 脚本运行,那么您可以按照您的建议进行操作,并在其自己的文件中拥有该功能。如果您使用以下函数创建一个名为 TimeToFrame.sql 的文件:

    FUNCTION TimeToFrame(pTime IN Varchar2)
    return NUMBER IS
      nTime NUMBER;
    BEGIN
      select (SUBSTR(pTime, 1, 2) * 108000)+(SUBSTR(pTime, 4, 2) * 1800)
        +(SUBSTR(pTime, 7, 2)     * 30)+SUBSTR(pTime, 10, 2)
      into nTime
      from dual;
      return nTime;
    END TimeToFrame;
    

    然后从 SQL*Plus 或您可以执行的其他脚本:

    Declare
      nTime Number;
      @TimeToFrame
    Begin
      nTime:=TimeToFrame('47:59:59:29');
      DBMS_OUTPUT.PUT_LINE(nTime);
    End;
    /
    
    5183999
    PL/SQL procedure successfully completed.
    

    当然,包含函数的文件必须在 SQL*Plus 可以看到的地方。另请注意,由于包含外部文件,文件的内容被合并到匿名块中,因此如果您执行list,那么您会看到整个内容 - 而不是对@ 的原始引用。正如AmmoQ所说,匿名块在数据库中执行;这是关于在将块发送到数据库执行之前在客户端中创建块。

    当然,最好将函数创建为存储子程序或包。

    【讨论】:

      猜你喜欢
      • 2017-09-02
      • 1970-01-01
      • 1970-01-01
      • 2017-01-29
      • 1970-01-01
      • 1970-01-01
      • 2015-08-25
      • 2017-06-09
      • 1970-01-01
      相关资源
      最近更新 更多