2016-05-31 70 views
0

DMLコマンドを持つプロシージャがあります。プロシージャは型outの変数を受け入れ、値を返します。
私は関数からこのプロシージャを呼び出す必要があります。
目的は、関数が変数outの値を返すことで、プロシージャを返します。
は(私はSSISのためにそれを必要とするが、私はそれが他のケースで有用であると考えています。)の試行中にOracle PL/SQL:関数からDMLプロシージャをコールする

が、私はこれらのエラーを得た:

ORA-14551:内部のDML操作を実行することはできませんクエリのヒント。
ORA-06519:アクティブな自律型トランザクションが検出され、ロールバックされました。

私は正しい構文を探しています。機能するソリューションの

+0

どこに問題がありますか? –

+0

どこから呼び出す必要がありますか? SQLまたはPL/SQLから? – pablomatico

+0

質問をより明確にするために、エラーを生成するコードを追加する必要があります。 ORA-14551は、問合せ内でDMLコマンドを使用する場合に作成する必要がありますが、これは書面ではわかりません(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; 
関連する問題