2016-05-31 52 views
0

我有一個包含DML命令的過程。該過程接受一個輸出類型的變量,並返回一個值。
我需要從函數調用此過程。
目標是函數將返回變量的值返回給程序。
(我需要它的SSIS,但我相信它在其他情況下是有用的。)Oracle PL/SQL:從函數調用DML過程

在嘗試,我得到了這些錯誤:

ORA-14551:不能內進行DML操作查詢提示。
ORA-06519:檢測並回退活動自治事務。

我正在尋找正確的語法來做到這一點。一個可行的解決方案的

+0

在哪裏的問題? –

+0

你需要從哪裏調用它?從SQL還是PL/SQL? – pablomatico

+0

您應該添加生成錯誤的代碼以使問題更清晰。如果您在查詢中使用DML命令,則應該生成ORA-14551,這在您的寫作中不明確(請參閱http://www.dba-oracle.com/t_ora_14551_cannot_perform_a_dml_operation_inside_a_query.htm – Carlo

回答

0

例子:

的過程:

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; 
0

下面是你需要什麼樣的例子做。知道這是未經證實的,但應該給你一個通往哪條路的總體思路。這被稱爲動態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;