ORA-02046: ORA-02046:分布式事务处理已经开始

时间:2022-12-19 06:19:21
 

平台: Oracle10.2.0.4

--执行第一遍没问题, 执行第二遍就不行, 除非退出当前session(如退出toad)

BEGIN
   PKG_EMOA_OUT_ECHARGING.fetchPlayerChargeDetail (SYSDATE);
END;
Error at line 2
ORA-02046: distributed transaction already begun
ORA-02063: preceding line from BI
ORA-06512: at "EMOA.PKG_EMOA_OUT_ECHARGING", line 91
ORA-06512: at "EMOA.PKG_EMOA_OUT_ECHARGING", line 115
ORA-06512: at line 2

由于package里cusor中select的视图是通过dblink获得的, 而远程数据库中被调用的视图, 又通过dblink调用了其它的表, 真是够复杂的. 然后就出现了该错.

--重建了dblink也无效

--临时解决办法(强行关闭dblink)

BEGIN
   execute immediate 'alter session close database link BI.LK';
   PKG_EMOA_OUT_ECHARGING.fetchPlayerChargeDetail (SYSDATE);
END;

--End--

 

这个是oracle内部错误,原因是有同一个会话没有完成,其操作还在数据缓冲区中,这时该会话并没有退出,在UNIX就是僵尸进程,WINDOWS下就是死进程,由ORACLE后台清理程序完成退出操作。

你可以在SYS用户下查找该会话的SPID,然后KILL它,然后执行就可以了,也就是在另外的会话中执行该语句。

做个sql trace
Alter session set events '10046 trace name context forever, level 4';

看看根本的recursive sql的问题是哪里