oracle 触发器自治事务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle 触发器自治事务相关的知识,希望对你有一定的参考价值。

create or replace trigger TRG_I_DELETE before delete on wx_sheetfitting for each row
declare
PRAGMA AUTONOMOUS_TRANSACTION;
affirmdate1 varchar2(10);
begin
select affirmdate
into affirmdate1
from wx_sheet t
where t.sheetno = :old.sheetno;
dbms_output.put_line(affirmdate1);
if affirmdate1 is not null then
rollback;
else
commit;
end if;
end;
为什么committ 和rollback 无效?

触发器无需commit
也不能写commit
触发器和触发它的DML是同一个事务
DML提交了,触发器的操作也提交了,要不就一起回滚了
当然,如果你一定要在触发器里写COMMIT
那就用自治事务
相当于一个事务里的子事务
正常情况下,Oracle规定在触发器中不能运行 ddl语句和commit,rollback语句。
参考技术A 这个回答是误人子弟啊。
人家已经声明为 PRAGMA AUTONOMOUS_TRANSACTION; 自治事务了,

就是要有COMMIT的

ABAP 中的自治事务模拟

【中文标题】ABAP 中的自治事务模拟【英文标题】:Autonomous transaction analogue in ABAP 【发布时间】:2022-01-04 09:07:25 【问题描述】:

我正在尝试在主程序仍在运行而不提交的情况下在数据库表中提交 DML 更新,因为将来可能会出现错误并且可能需要回滚它,但内部(已保存)更新应该保留. 就像在 Oracle 自治事务中一样。

Call function ... starting new task ...Submit ... and return 不起作用,因为它们会影响主事务。

有没有办法在不中断主 LUW 的情况下启动嵌套数据库 LUW 并提交它?

【问题讨论】:

是否可以将“嵌套更新”移动到“主更新”前面,例如 prepare( ). COMMIT WORK. main( ) ?嵌套两个事务还意味着您会看到两种不同的数据库状态,具体取决于您所在的事务。 你说“[aRFC] 或 Submit [...] 不起作用,因为它们会影响主事务”,我不同意,只有 Submit 在同一个数据库 LUW 中运行, aRFC 在其自己的数据库 LUW 中运行。如果您想继续讨论 aRFC,请澄清。请注意,ABAP SQL 允许本地“服务连接”,以便在同一个 ABAP LUW 中启动不同的数据库 LUW(所有 ABAP SQL 语句中的CONNECTION 字,连接以名称R/3* 开头)。 【参考方案1】:

您可以创建单独的函数来保存您的更改,您可以使用 开始新任务 模式调用您的函数,如下所示。

  call function 'ZFUNCTION' starting new task 'SAVECHANGES'
   exporting
     param  = value.

【讨论】:

问题说他们已经尝试过了,但没有成功。 “调用函数开始新任务或提交并返回不起作用,因为它们会影响主事务。” @Philipp 它正在工作。也许他们还有另一个问题。【参考方案2】:

我不知道如何使用 OpenSQL 执行此操作。但是当你使用ADBC framework时,那么CL_SQL_CONNECTION类的每个实例operates within a separate database LUW。

我一般不建议使用 ADBC,除非你必须这样做,因为:

您现在将 SQL 语句编写为字符串,这意味着您没有编译时语法检查。 您不能再将变量放入 SQL 代码中。 (好吧,你可以,但你不应该,因为你可能会以这种方式创建 SQL 注入漏洞)。您需要使用statement->set_param 传递所有变量。 您现在正在编写 NativeSQL,这意味着您可能会无意中编写无法移植到其他数据库后端的 SQL。

【讨论】:

“我不知道如何使用 OpenSQL 执行此操作” 是否可以创建与主数据库的辅助数据库连接? (虽然这不是一个好主意......)

以上是关于oracle 触发器自治事务的主要内容,如果未能解决你的问题,请参考以下文章

oracle 触发器自治事务

使用自治事务触发

Oracle自治事务实际用例

自治事务在 Oracle 中有自己的会话吗?

快讯:Oracle自治事务处理数据库发布和19c路线图

自治事务中的 Oracle DDL