我想知道在函数/过程中插入/删除/更新后是否有必要编写提交?
例:@H_301_2@
create or replace function test_fun return number is begin delete from a; return 0; end;
或程序@H_301_2@
create or replace procedure aud_clear_pro as begin delete from a; end;
无法理解以下情况:@H_301_2@
>如果我从sql窗口调用函数/过程,则需要提交@H_301_2@
但
>如果我使用dbms_scheduler计划函数/过程并运行作业,则会自动提交delete语句.@H_301_2@
为什么?@H_301_2@
通常,程序不应该提交.那些类型的事务控制决策应该留给更高级别的代码,这些代码知道逻辑事务何时实际完成.如果您在存储过程内部提交,则限制其可重用性,因为希望程序所做的更改成为更大事务的一部分的调用者不能直接调用该过程.
原文链接:/oracle/205322.html如果以交互方式调用过程,则必须显式提交或回滚事务,因为Oracle不知道您是否希望过程调用是逻辑事务,或者是否打算组成涉及多个过程调用的较大事务.如果使用dbms_scheduler,则dbms_scheduler假定作业是逻辑事务,并在作业结束时提交,假设它成功(dbms_job执行相同的操作).@H_301_2@
函数不应该首先操纵数据.无法从sql语句中调用操作数据的函数(除非声明函数本身使用几乎从不合适的自治事务的极端情况).拥有这两个函数和过程的关键在于函数可以嵌入到sql语句中,并且可以更自由地授予用户,因为它们不会更改任何数据.@H_301_2@