Oracle PL / SQL:从函数调用DML过程

时间:2016-05-31 05:40:31

标签: oracle function stored-procedures plsql ssis

我有一个具有DML命令的过程。该过程接受一个类型为out的变量,并返回一个值 我需要从一个函数调用这个过程 目标是函数将返回变量的值out返回程序 (我需要它用于SSIS,但我相信它在其他情况下很有用。)

在尝试期间,我遇到了这些错误:

  

ORA-14551:无法在查询提示内执行DML操作   ORA-06519:检测到并回滚了主动自治事务。

我正在寻找合适的语法来实现它。

2 个答案:

答案 0 :(得分: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命令的末尾执行 commit;

功能:

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;

答案 1 :(得分: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;