Oracle:从“select from dual”调用函数什么都不做

时间:2017-10-04 14:52:33

标签: oracle function plsql

我有一个插入和更新表的函数。从以下地方打电话:

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;
/

前两个表达有什么问题?

2 个答案:

答案 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