2016-05-31 54 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;