在功能/过程中DML操作后是否需要提交?
-
22-10-2019 - |
题
我想知道是否有必要在功能/过程中插入/删除/更新后写入提交?
例子:
create or replace function test_fun
return number is
begin
delete from a;
return 0;
end;
或程序
create or replace procedure aud_clear_pro
as
begin
delete from a;
end;
删除后需要提交吗?
无法理解以下情况:
如果我从SQL窗口调用函数/过程,则需要提交
但
如果我使用dbms_scheduler安排功能/过程并运行该作业,则会自动提交删除语句。
为什么?
解决方案
通常,程序不应提交。这些类型的交易控制决策应留给高级代码,该代码知道何时真正完成逻辑交易。如果您在存储过程中提交,则可以限制其可重复使用性,因为想要更改该过程的呼叫者成为较大交易的一部分,不能直接直接调用该过程。
如果您进行交互方式调用过程,则必须明确提交或回滚交易,因为Oracle不知道您打算打算该过程调用作为逻辑事务,或者您打算构成涉及多个过程调用的较大事务。如果您使用 dbms_scheduler
, dbms_scheduler
假设工作是一项逻辑交易,并在工作结束时承诺,假设它是成功的(dbms_job
做同样的事情)。
功能不应首先操纵数据。操纵数据的函数无法从SQL语句中调用(除非宣布函数本身使用自主事务的角案例,而该函数几乎永远不合适)。具有函数和过程的全部要点是,函数可以嵌入SQL语句中,并且可以更自由地授予用户,因为它们不会更改任何数据。
其他提示
回答你的问题;为什么?
由于该职位已有2年的历史,因此您可能已经知道了这一点。但是我会为记录做出回应。
#1的原因需要提交,而#2则不是因为Oracle中的默认数据库设置是在会话结束时提交事务。如果您在sqlplus中并手动运行代码,则不会立即提交交易。如果您发布明确提交或注销SQLPU,则交易将提交。
您在#2上获得自动提交的原因是因为它创建了一个会话来运行脚本。完成后,它会自动注销,这将导致自动提交。
不隶属于 dba.stackexchange