我想知道在函数/过程中插入/删除/更新后是否需要写提交?
例子:
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 中并手动运行代码,它不会立即提交事务。如果您发出显式提交或注销 sqlpus,则事务将提交。
您在 #2 上获得自动提交的原因是因为它创建了一个会话来运行您的脚本。完成后它会自动注销,这将导致自动提交。