我有一个包含DML命令的过程。该过程接受一个输出类型的变量,并返回一个值。
我需要从函数调用此过程。
目标是函数将返回变量的值返回给程序。
(我需要它的SSIS,但我相信它在其他情况下是有用的。)Oracle PL/SQL:从函数调用DML过程
在尝试,我得到了这些错误:
ORA-14551:不能内进行DML操作查询提示。
ORA-06519:检测并回退活动自治事务。
我正在寻找正确的语法来做到这一点。一个可行的解决方案的
我有一个包含DML命令的过程。该过程接受一个输出类型的变量,并返回一个值。
我需要从函数调用此过程。
目标是函数将返回变量的值返回给程序。
(我需要它的SSIS,但我相信它在其他情况下是有用的。)Oracle PL/SQL:从函数调用DML过程
在尝试,我得到了这些错误:
ORA-14551:不能内进行DML操作查询提示。
ORA-06519:检测并回退活动自治事务。
我正在寻找正确的语法来做到这一点。一个可行的解决方案的
例子:
的过程:
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;
下面是你需要什么样的例子做。知道这是未经证实的,但应该给你一个通往哪条路的总体思路。这被称为动态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;
在哪里的问题? –
你需要从哪里调用它?从SQL还是PL/SQL? – pablomatico
您应该添加生成错误的代码以使问题更清晰。如果您在查询中使用DML命令,则应该生成ORA-14551,这在您的写作中不明确(请参阅http://www.dba-oracle.com/t_ora_14551_cannot_perform_a_dml_operation_inside_a_query.htm – Carlo