我们可以在Oracle SQL函数中使用commit语句吗?

时间:2016-05-25 11:50:42

标签: sql oracle

在SQL函数中使用COMMIT语句是否可行/有意义?

3 个答案:

答案 0 :(得分:6)

从技术上讲,答案是肯定的。您可以执行以下操作:

create or replace function committest return number as 
begin 
  update my_table set col = 'x';
  commit;
  return 1;
end;
/

declare
  number n;
begin
  n := committest();
end;
/

但是,您无法执行以下操作:

select committest() from dual;

这将是查询期间提交,从而导致

ORA-14552:无法在查询或DML中执行DDL提交或回滚

答案 1 :(得分:4)

是的,如果您将该功能设为自治事务,则可以这样做。这样它就不再是当前交易的一部分了。

create or replace function doIt
as
  pragma autonomous_transaction;
begin
  ... code ...
  commit;
end;
/

More documentation

答案 2 :(得分:-4)

不,这是不可能的,请参阅文档:
https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_5009.htm

  

用户定义函数的限制

     

....此外,当从查询或DML中调用函数时   声明,功能不能:....

     
      
  • 提交或回滚当前事务,创建保存点或回滚到保存点,或更改会话或系统。 DDL   语句隐式提交当前事务,所以a   用户定义的函数不能执行任何DDL语句。
  •