我有一個包含DML命令的過程。該過程接受一個輸出類型的變量,並返回一個值。
我需要從函數調用此過程。
目標是函數將返回變量的值返回給程序。
(我需要它的SSIS,但我相信它在其他情況下是有用的。)Oracle PL/SQL:從函數調用DML過程
在嘗試,我得到了這些錯誤:
ORA-14551:不能內進行DML操作查詢提示。
ORA-06519:檢測並回退活動自治事務。
我正在尋找正確的語法來做到這一點。一個可行的解決方案的
我有一個包含DML命令的過程。該過程接受一個輸出類型的變量,並返回一個值。
我需要從函數調用此過程。
目標是函數將返回變量的值返回給程序。
(我需要它的SSIS,但我相信它在其他情況下是有用的。)Oracle PL/SQL:從函數調用DML過程
在嘗試,我得到了這些錯誤:
ORA-14551:不能內進行DML操作查詢提示。
ORA-06519:檢測並回退活動自治事務。
我正在尋找正確的語法來做到這一點。一個可行的解決方案的
例子:
的過程:
create or replace procedure MyProc(outRes OUT NUMBER)
is
begin
update some_table set some_description = 'abc';
commit;
if (some_condition) then
outRes := 666;
else
outRes := 999;
end if;
end MyProc;
注意:必須做承諾;在DML命令的末尾。
功能:
CREATE or replace FUNCTION MyFunc
RETURN int IS
PRAGMA AUTONOMOUS_TRANSACTION;
myVar number;
begin
MyProc(myVar);
return myVar;
END MyFunc;
注意,在函數的開頭有:PRAGMA AUTONOMOUS_TRANSACTION;
而這個函數調用:
select MyFunc() as res from dual;
下面是你需要什麼樣的例子做。知道這是未經證實的,但應該給你一個通往哪條路的總體思路。這被稱爲動態SQL並使用綁定變量。還有很多更我不知道這樣的數據鍵入程序吐出來並沒有什麼......所以,如果它不是VARCHAR2然後相應地改變它......
FUNCTION myFunc(procedure_call varchar2) RETURN VARCHAR2
IS
v_out1 varchar2(500);
BEGIN
EXECUTE IMMEDIATE 'begin '||procedure_call||'(:out1); end;' using v_out1;
RETURN v_out;
END;
在哪裏的問題? –
你需要從哪裏調用它?從SQL還是PL/SQL? – pablomatico
您應該添加生成錯誤的代碼以使問題更清晰。如果您在查詢中使用DML命令,則應該生成ORA-14551,這在您的寫作中不明確(請參閱http://www.dba-oracle.com/t_ora_14551_cannot_perform_a_dml_operation_inside_a_query.htm – Carlo