我创建了一个存储过程,它调用一个返回boolean的函数。
我们在运行时获取函数所在的模式名称,因此我们通过连接将该语句创建为字符串,并动态地在匿名块中执行该函数。
CREATE OR REPLACE PROCEDURE usp_proc
(
varicable 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
变量。我怎样才能在以后的程序中使用它的值?
答案 0 :(得分:1)
您可以在流程和pass it as an OUT
bind variable中声明ConversionFactor
作为动态PL / SQL块中的局部变量,而不是将其定义为动态PL / SQL块中的局部变量。您也可以以相同的方式获取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
。 (我还在架构和函数名称之间添加了一段缺失的时间段。)