oracle – 在Function / Procedure中进行DML操作后是否需要提交?

前端之家收集整理的这篇文章主要介绍了oracle – 在Function / Procedure中进行DML操作后是否需要提交?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想知道在函数/过程中插入/删除/更新后是否有必要编写提交?

例:@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@

无法理解以下情况:@H_301_2@

>如果我从sql窗口调用函数/过程,则需要提交@H_301_2@


>如果我使用dbms_scheduler计划函数/过程并运行作业,则会自动提交delete语句.@H_301_2@

为什么?@H_301_2@

通常,程序不应该提交.那些类型的事务控制决策应该留给更高级别的代码,这些代码知道逻辑事务何时实际完成.如果您在存储过程内部提交,则限制其可重用性,因为希望程序所做的更改成为更大事务的一部分的调用者不能直接调用该过程.

如果以交互方式调用过程,则必须显式提交或回滚事务,因为Oracle不知道您是否希望过程调用是逻辑事务,或者是否打算组成涉及多个过程调用的较大事务.如果使用dbms_scheduler,则dbms_scheduler假定作业是逻辑事务,并在作业结束时提交,假设它成功(dbms_job执行相同的操作).@H_301_2@

函数不应该首先操纵数据.无法从sql语句中调用操作数据的函数(除非声明函数本身使用几乎从不合适的自治事务的极端情况).拥有这两个函数和过程的关键在于函数可以嵌入到sql语句中,并且可以更自由地授予用户,因为它们不会更改任何数据.@H_301_2@

原文链接:/oracle/205322.html

猜你在找的Oracle相关文章