我有一个具有DML命令的过程。该过程接受一个类型为out的变量,并返回一个值 我需要从一个函数调用这个过程 目标是函数将返回变量的值out返回程序 (我需要它用于SSIS,但我相信它在其他情况下很有用。)
在尝试期间,我遇到了这些错误:
ORA-14551:无法在查询提示内执行DML操作 ORA-06519:检测到并回滚了主动自治事务。
我正在寻找合适的语法来实现它。
答案 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;