从oracle中的过程中获取匿名块的值

时间:2017-06-06 10:56:14

标签: oracle stored-procedures plsql

我创建了一个存储过程,它调用一个返回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变量。我怎样才能在以后的程序中使用它的值?

1 个答案:

答案 0 :(得分:1)

您可以在流程和pass it as an OUT bind variable中声明ConversionFactor作为动态PL / SQL块中的局部变量,而不是将其定义为动态PL / SQL块中的局部变量。您也可以以相同的方式获取res值。您的var1var2var3值也可以/应该作为绑定变量传递,而不是将它们连接到调用中。

使用匿名块而不是过程进行演示,因为你的其他东西有些错误,并且在指定的模式中有一个虚函数:

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 ConversionFactorout res,因此请将它们标记为OUT绑定变量。其他人默认为IN。 (我还在架构和函数名称之间添加了一段缺失的时间段。)