今天在存储过程中通过dblink的方式从oracle中往sql server中的表插入数据时,报如下的错误:
ERROR ORA-02054: 未决事务处理 15.29.1031
ORA-28500: 连接 ORACLE 到非 Oracle 系统时返回此信息:
[Oracle][ODBC SQL Server Driver][SQL Server]对象名 'RECOVER.HS_TRANSACTION_LOG' 无效。 {42S02,NativeErr = 208}
ORA-02063: 紧接着 2 lines (起自 SY30SMOKERHIN) ORA-02054: 未决事务处理 15.29.1031
查阅网上资料:
(1) 有人说在"begin end"块中,有两段事务,一段是oracle的,一段是sql server ,update或者insert完oracle或者sql server,都要先commit后再进行下一轮的insert 或者update(试过了,问题依旧)
(2) 也有人说修改dblink的监听文件initdg4msql.ora,我没有这个权限,就没有试
(3)在sql server中新增表:
DROP TABLE HS_TRANSACTION_LOG
go
CREATE TABLE HS_TRANSACTION_LOG(
GLOBAL_TRAN_ID char (64) NOT NULL,
TRAN_COMMENT char (255) NULL
)
go
grant all on HS_TRANSACTION_LOG to public
go
看着有点靠谱,与错误提示相符,但经过我的测试发现,这样直接执行是不行的,问题依旧
但通过这个方案加上前面的错误提示,我猜表HS_TRANSACTION_LOG应该是保存事务临时数据的,新增这样表的必须的,但为什么我新增了表依旧不行呢?原因是没在对应的架构下新增表(即RECOVER架构),所以得出下面的解决方案
解决方案如下:
1 在sql server端切换到对应的数据库
use 你的数据库名称
go
2 在你要操作的数据库下的架构那里新增架构并设置如下,如下图:
3 新增表HS_TRANSACTION_LOG
CREATE TABLE [RECOVER].[HS_TRANSACTION_LOG](
GLOBAL_TRAN_ID char (64) NOT NULL,
TRAN_COMMENT char (255) NULL
)
go
4 为表HS_TRANSACTION_LOG授权,设置如下: