[英]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.