在SQL函数中使用COMMIT语句是否可行/有意义?
答案 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;
/
答案 2 :(得分:-4)
不,这是不可能的,请参阅文档:
https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_5009.htm
用户定义函数的限制
....此外,当从查询或DML中调用函数时 声明,功能不能:....
- 提交或回滚当前事务,创建保存点或回滚到保存点,或更改会话或系统。 DDL 语句隐式提交当前事务,所以a 用户定义的函数不能执行任何DDL语句。