繁体   English   中英

从 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值。 您的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 (我还在架构和函数名称之间添加了一个缺失的句点)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM