簡體   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