我有一个插入和更新表的函数。从以下地方打电话:
select AGENTS_REGISTRATION() from dual;
或:
declare
x NUMBER;
begin
select AGENTS_REGISTRATION() into x from dual;
end;
/
什么都不做。另一种形式做出了必要的改变:
declare
x NUMBER;
begin
x := AGENTS_REGISTRATION();
end;
/
前两个表达有什么问题?
答案 0 :(得分:4)
Oracle不允许查询中的DML
操作。调用查询中inserts/updates/deletes
数据将引发的函数:
如果ORA-14551:无法在查询中执行DML操作
exception
被困在函数中,查询不会引发错误 - 使用WHEN OTHERS
异常处理程序(或直接使用ORA-14551
)捕获pragma exception_init
非常危险正如您在此示例中看到的那样,重新引发错误。
虽然我不建议这样做,但如果函数定义为DML
(通过使用autonomous transaction
),则可以在查询中使用pragma autonomous_transaction
操作 - 但这将导致更多问题。
解决方案不是在查询中调用函数 - 这样做肯定没有意义。
答案 1 :(得分:1)
选中http://www.dba-oracle.com/t_ora_14551_cannot_perform_a_dml_operation_inside_a_query.htm
create or replace function myFunction return varchar2 as
begin
update emp set empno = empno +1 where empno = 0;
return 'Yeah';
end;
/
SQL> var myVar VARCHAR2
SQL> call myFunction() INTO :myVar;
SQL> print myVar