问题描述
我在触发器期间使用Pragma autonousous_transaction,因为它通过使用Execute_Immediate的远程过程更新远程MS SQL Server表。没有启用autonomous_transaction,我收到错误-“ORA-02047: 无法加入正在进行的分布式事务”。那部分工作正常。但是,在触发器的早期,我需要根据a :NEW查询另一个表。 以获取远程过程调用所需的输入。启用autonomous_transaction后,查询返回 “ORA-01403: 未找到数据”。没有启用查询返回正确的数据,但远程调用错误 (如前所述)。
有一个应用程序将数据插入触发器所在的表中。我相信应用程序可能会对触发器表和我要查询的表进行事务性更新,尽管它肯定会根据表关系将数据添加到查询表中。我不确定autonous_transaction是否使查询表数据尚未提交/可用或什么。
由于远程查询,我无法想到提供LiveSQL示例的方法。
提前感谢您提供的任何帮助。
鲍勃
有一个应用程序将数据插入触发器所在的表中。我相信应用程序可能会对触发器表和我要查询的表进行事务性更新,尽管它肯定会根据表关系将数据添加到查询表中。我不确定autonous_transaction是否使查询表数据尚未提交/可用或什么。
由于远程查询,我无法想到提供LiveSQL示例的方法。
create or replace TRIGGER TR_TABLE2_BEFORE_INSERT
BEFORE INSERT
ON Table2
FOR EACH ROW
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
MyException EXCEPTION;
MyVar varchar2(30);
BEGIN
-- With PRAGMA AUTONOMOUS_TRANSACTION - QUERY returns No Data Found, returns fine otherwise
-- Tested Static Var without query and remote proc completes successfully
-- QUERY
SELECT MyAppField1 INTO MyVar FROM Table1 WHERE Table1.xID = :NEW.xID;
-- STATIC VAR
MyVar := 'XYZ';
IF MyVar = 'XYZ' THEN
DECLARE
sDateTime VARCHAR2(100);
iSQLPassthrough INTEGER;
BEGIN
sDateTime := to_char(current_timestamp,'yyyy-mm-dd hh24:mi:ss');
iSQLPassthrough := DBMS_HS_PASSTHROUGH.EXECUTE_IMMEDIATE@REMOTE_SQLSERVER('UpdateMyStatus "'||MyVar||'" , "'||sDateTime||'"' );
END IF;
COMMIT;
EXCEPTION
WHEN MyException THEN
BEGIN
-- CUSTOM LOG WRITER PROC
END;
WHEN OTHERS THEN
g_err_code := SQLCODE;
g_err_msg := SUBSTR(SQLERRM, 1, 2000);
BEGIN
-- CUSTOM LOG WRITER PROC
END;
END;
提前感谢您提供的任何帮助。
鲍勃
专家解答
您是否有机会在同一事务中的table1和2中插入xID?
因为自治事务只能看到已提交的数据。会话中的未提交更改对它来说是不可见的:
因为自治事务只能看到已提交的数据。会话中的未提交更改对它来说是不可见的:
create table t1 ( x int ); create table t2 ( x int ); create or replace trigger trg before insert on t2 for each row declare t1_x t1.x%type; pragma autonomous_transaction; begin select * into t1_x from t1 where t1.x = :new.x; dbms_output.put_line ( 'Found ' || t1_x ); commit; end; / insert into t1 values (1); insert into t2 values (1); ORA-01403: no data found commit; insert into t2 values (1); Found 1 select * from t1; X 1 select * from t2; X 1
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




