![](/img/trans.png)
[英]Can we call procedure or function from anonymous block in oracle?
[英]Get value from anonymous block inside a procedure in oracle
我创建了一个存储过程,它调用一个返回布尔值的函数。
我们在运行时获取函数所在的模式名称,因此我们通过串联将语句创建为字符串,并在匿名块中动态执行函数。
CREATE OR REPLACE PROCEDURE usp_proc
(
variable declarations
)
as
var1 varchar2(50);
var2 varchar2(50);
var3 varchar3(50);
begin
execute immediate
'declare result boolean ; ConversionFactor number; res varchar2(10); begin result:= '||schemaname||'fn_name('''||var1||''', '''||var2||''',ConversionFactor,'''||var3||''');'||
' if(result=False) then res:=''False'';'||
' ELSE res:=''True''; END IF; end;';
stmt:='select Weight*ConversionFactor from table'
Open cur for stmt;
END;
我需要在匿名块之外使用ConversionFactor
变量。 我怎样才能获得它的价值以在程序的后面使用?
与其将ConversionFactor
定义为动态 PL/SQL 块中的局部变量,不如在过程中声明它并将其作为OUT
绑定变量传递。 你也可以用同样的方式取回res
值。 您的var1
、 var2
和var3
值也可以/应该作为绑定变量传递,而不是将它们连接到调用中。
演示使用匿名块而不是过程,因为你的还有一些其他问题,以及指定模式中的虚拟函数:
declare
var1 varchar2(50);
var2 varchar2(50);
var3 varchar2(50);
schemaname varchar2(30);
res varchar2(5);
ConversionFactor number;
begin
schema := 'SOME_SCHEMA';
-- also assign values to var1, var2 and var, presumably
execute immediate
'declare result boolean;'
|| 'begin'
|| ' result := '||schemaname||'.fn_name(:var1, :var2, :ConversionFactor, :var3);'
|| ' :res := case when result then ''True'' else ''False'' end;'
|| 'end;'
using var1, var2, out ConversionFactor, var3, out res;
dbms_output.put_line('Got result: ' || res);
dbms_output.put_line('Got ConversionFactor: ' || ConversionFactor);
end;
/
Got result: True
Got ConversionFactor: 42
PL/SQL procedure successfully completed.
注意out ConversionFactor
和out res
,因此将它们标记为OUT
绑定变量。 其他人保留默认为IN
。 (我还在架构和函数名称之间添加了一个缺失的句点)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.