+-
                                
                                    
                                
                                
                                    
                                
                                
                                    
                                        
                                        
                                        
                                        
                                        
                                            
                                        
                                        
                                    
                                
                            
                        
环境
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)
)';