如何从pl / sql匿名块调用pl / sql匿名块

时间:2014-08-07 12:07:04

标签: oracle plsql

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

我无法在存储在DB中的过程或包中声明此函数。换句话说,如何从另一个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;

3 个答案:

答案 0 :(得分:2)

不幸的是,没有办法实现这一目标。在处理匿名块之后,匿名块中声明的嵌套子程序甚至不会被持久化,因此即使我们忽略了作用域限制,当处理另一个匿名块时,也不存在

如果您无法将其设为存储函数,因为邪恶的DBA不允许这样做,则必须复制粘贴该函数。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

在您的评论和问题编辑之后,如果您的匿名块作为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说,匿名块在数据库中执行;这是关于在客户端发送到要执行的数据库之前创建块。

当然,将函数创建为存储的子程序或包中仍然会好得多。