我有以下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;
答案 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说,匿名块在数据库中执行;这是关于在客户端发送到要执行的数据库之前创建块。
当然,将函数创建为存储的子程序或包中仍然会好得多。