我想知道是否有必要在功能/过程中插入/删除/更新后写入提交?

例子:

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;

删除后需要提交吗?

无法理解以下情况:

  1. 如果我从SQL窗口调用函数/过程,则需要提交

  2. 如果我使用dbms_scheduler安排功能/过程并运行该作业,则会自动提交删除语句。

    为什么?

有帮助吗?

解决方案

通常,程序不应提交。这些类型的交易控制决策应留给高级代码,该代码知道何时真正完成逻辑交易。如果您在存储过程中提交,则可以限制其可重复使用性,因为想要更改该过程的呼叫者成为较大交易的一部分,不能直接直接调用该过程。

如果您进行交互方式调用过程,则必须明确提交或回滚交易,因为Oracle不知道您打算打算该过程调用作为逻辑事务,或者您打算构成涉及多个过程调用的较大事务。如果您使用 dbms_scheduler, dbms_scheduler 假设工作是一项逻辑交易,并在工作结束时承诺,假设它是成功的(dbms_job 做同样的事情)。

功能不应首先操纵数据。操纵数据的函数无法从SQL语句中调用(除非宣布函数本身使用自主事务的角案例,而该函数几乎永远不合适)。具有函数和过程的全部要点是,函数可以嵌入SQL语句中,并且可以更自由地授予用户,因为它们不会更改任何数据。

其他提示

回答你的问题;为什么?

由于该职位已有2年的历史,因此您可能已经知道了这一点。但是我会为记录做出回应。

#1的原因需要提交,而#2则不是因为Oracle中的默认数据库设置是在会话结束时提交事务。如果您在sqlplus中并手动运行代码,则不会立即提交交易。如果您发布明确提交或注销SQLPU,则交易将提交。

您在#2上获得自动提交的原因是因为它创建了一个会话来运行脚本。完成后,它会自动注销,这将导致自动提交。

许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top