+-
环境
oracle 版本 11.2r sqlserver 2012
需求
Oracle 通过 gateway dblink 打通和 sqlserver的连接。用户能够直接访问oracle获得sqlserver的数据。
关键问题
select * from dbo.Alarm@LINK_ASDWMS
> ORA-01002: fetch out of sequence
ORA-02063: preceding line from LINK_ASDWMS
> 时间: 0.353s
当所有配置完成后,查询sqlserver下的表时,会报这个错误。
猜测
猜测一通过配置,oracle应该是可以检测到sqlserver的存在
我为什么会得出这个结论,原因如下:
当我修改 select 语句,查询一个完全不存在的表时
select * from dbo.NotFount@LINK_ASDWMS
> ORA-00942: table or view does not exist
[Oracle][ODBC SQL Server Driver][SQL Server]对象名 'DBO.NOTFOUNT' 无效。 {42S02,NativeErr = 208}[Oracle][ODBC SQL Server Driver][SQL Server]无法预定义语句。 {42000,NativeErr = 8180}
ORA-02063: preceding 2 lines from LINK_ASDWMS
> 时间: 0.1s
能够精准的报错,提示表不存在。
猜测二数据可能没有正常返回到oracle就报错了,因为查了两张表,一张有 163373 万条数据,另一个是0条数据,执行速度都差不多,在有些情况下,0条数据的表执行速度甚至还更慢。
配置
# C:\product\11.2.0\tg_1\dg4msql\admin\initdg4msql.ora
HS_FDS_CONNECT_INFO=[172.16.xxx.xx1,1433]/instanceName/dbName
HS_FDS_TRACE_LEVEL=OFF
HS_FDS_RECOVERY_ACCOUNT=sa
HS_FDS_RECOVERY_PWD=xxxxxxxxx
# C:\product\11.2.0\tg_1\NETWORK\ADMIN\listener.ora
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(SID_NAME= dg4msql)
(ORACLE_HOME = C:\product\11.2.0\tg_1)
(PROGRAM= dg4msql)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = WIN-V11L22M0BL3)(PORT = 15210))
)
)
ADR_BASE_LISTENER = C:\product\11.2.0\tg_1
Dblink 创建语句
create public database link LINK_ASDWMS connect to "sa" identified by "xxxxxxxx" using '(DESCRIPTION =
(ADDRESS =
(PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 15210)
)
(CONNECT_DATA =
(SERVICE_NAME = ASD_WMS)
)
(HS = OK)
)';