2015-03-13 67 views
0

这可能只是对Oracle SQL和PL/SQL中存在的不同类型变量的误解,但是我怎样才能将PL/SQL函数的返回值用作SQL脚本中另一个PL/SQL函数的输入必须手动将其设置为DEFINE变量的值?Oracle SQL PL/SQL:使用函数的返回值作为另一个函数的输入?

下面是代码(被Oracle SQL Developer中内部的SQL脚本内运行):

-- some INSERTS/UPDATES/SELECTS ... 
DEFINE in = 'somevalue'; 

VAR return1 NUMBER; 
EXECUTE :return1 := someschema.somepackage.somefunction(in); 
PRINT return1; 
-- reasonable return value gets printed out 

VAR return2 NUMBER; 
EXECUTE :return2 := someschema.somefunction(return1); 
--          ^
-- this does not work ----------------------+ 
-- (neither does ":return1") 

DEFINE in2 = <manually enter value of "return1"> 
EXECUTE :return2 := someschema.somefunction(in2); 
--          ^
-- this works ------------------------------+ 

-- some INSERTS/UPDATES/SELECTS ... 

感谢的提前。

+0

使用匿名块,声明一个变量的OUT参数。并使用与IN参数相同的变量作为函数。 – 2015-03-13 13:35:15

+0

传递':return1'是正确的,当你尝试时会发生什么? “不起作用”不是很有帮助。您尚未显示替代变量版本的&符号,因此您不能完全清楚您正在执行或正在执行的操作。使用块可能仍然更容易也更合适。 – 2015-03-13 13:44:42

+0

你说的第一个调用是一个过程,但它显然返回像函数一样的值。第一个程序是否有OUT参数? – ruudvan 2015-03-13 13:45:08

回答

2

DEFINEEXECUTE将如预期SQL*Plus工作。在SQL开发或来自客户端的脚本执行整个代码,我会建议你:

  1. 使用的匿名块
  2. DECLAREOUT parameter的过程,而另一个变量来存储功能的返回值的变量。
  3. BEGIN-END块中,调用过程。
  4. 并使用相同的变量来存储函数的返回值。

例如,

 
DECLARE 
    o_var ; 
    f_var ; 
BEGIN 
    -- call the procedure 
    package.procedure(o_var); 

    --call the function 
    SELECT package.function(o_var) INTO f_var FROM DUAL; 

    -- do something 
END; 
/
+0

你的回答让我走上了正确的轨道,虽然我只是意识到我应该谈论两个功能,而不是一个功能和一个程序(编辑问题) – tschlein 2015-03-16 09:46:45

+0

所以我的答案强调了差异程序和功能现在已经过时了,我正在删除它:) – Martina 2015-03-16 11:24:45

相关问题