sql server链接Oracle数据库

 看过的链接:http://t.zoukankan.com/varorbc-p-4308722.html

 

问题1:如何在sql server数据库中链接oracle数据库

问题1解决办法:下面是执行成功的sql脚本

USE [master]
GO
EXEC master.dbo.sp_addlinkedserver @server = N'MES', @srvproduct=N'oracle', @provider=N'OraOLEDB.Oracle', @datasrc=N'10.193.133.30/MES'

GO
EXEC master.dbo.sp_serveroption @server=N'MES', @optname=N'collation compatible', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'MES', @optname=N'data access', @optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption @server=N'MES', @optname=N'dist', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'MES', @optname=N'pub', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'MES', @optname=N'rpc', @optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption @server=N'MES', @optname=N'rpc out', @optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption @server=N'MES', @optname=N'sub', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'MES', @optname=N'connect timeout', @optvalue=N'0'
GO
EXEC master.dbo.sp_serveroption @server=N'MES', @optname=N'collation name', @optvalue=null
GO
EXEC master.dbo.sp_serveroption @server=N'MES', @optname=N'lazy schema validation', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'MES', @optname=N'query timeout', @optvalue=N'0'
GO
EXEC master.dbo.sp_serveroption @server=N'MES', @optname=N'use remote collation', @optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption @server=N'MES', @optname=N'remote proc transaction promotion', @optvalue=N'true'
GO
USE [master]
GO
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'MES', @locallogin = NULL , @useself = N'False', @rmtuser = N'DQ-TCX', @rmtpassword = N'123456'
GO

 

问题2:在存储过程中调用链接服务器,往oracle数据库中增删改报“无法启动分布式事务”

链接服务器"MES"的 OLE DB 访问接口 "OraOLEDB.Oracle" 返回了消息 "无法在事务中登记。"。
消息 7391,级别 16,状态 2,过程 trigger_upload_snum_status_oninserted,行 17 [批起始行 10]
无法执行该操作,因为链接服务器 "MES" 的 OLE DB 访问接口 "OraOLEDB.Oracle" 无法启动分布式事务。

问题2解决办法:

经查需要在oracle服务器上配置参数,由于oracle服务器不是我方的服务器,故想了其他办法。

办法就是,可以创建定时作业,在定时作业中调用增删改的存储过程,不会报错

 

问题3:作业执行一段时间后报错

链接服务器 "SITEMES" 的 OLE DB 访问接口 "OraOLEDB.Oracle" 为列提供的元数据不一致。对象 ""MES"."TM_SN_STATUS"" 的列 "ID" (编译时序号为 1)在编译时有 36"LENGTH",但在运行时有 72。 [SQLSTATE 42000] (错误 7356).  该步骤失败。

问题3解决办法:

在无变量的时候参考https://blog.csdn.net/u011078141/article/details/102996588内容,修改sql语句即可

例如原sql语句

INSERT INTO [SITEMES]..[MES].[TM_SN_STATUS]([ID],[ORDER_NO],[SN],[SN_STATUS],[UPDATE_STATUS],[LINE_NAME],[CREATE_DATE])VALUES(NEWID(),@workorder_number_superior,@material_card_code_superior,@card_status_superior,'1','TCX二期电驱',@create_date)

修改后

INSERT OPENQUERY (SITEMES, 'SELECT ID,ORDER_NO,SN,SN_STATUS,UPDATE_STATUS,LINE_NAME,CREATE_DATE FROM MES.TM_SN_STATUS')VALUES (NEWID(),@workorder_number_superior,@material_card_code_superior,@card_status_superior,'1','TCX二期电驱',@create_date);

上面需要注意的:

  1.sqlserver中的“[]”不能写在查询语句中

 

在有变量的时候参考https://www.csdn.net/tags/MtTaEgzsMjU4MTc4LWJsb2cO0O0O.html内容,修改sql语句,即使用exec()方法执行;

例如原sql语句

update [SITEMES]..[MES].[TM_SN_STATUS] set [SN_STATUS] = @card_status_superior,[UPDATE_STATUS]='1',[UPDATE_DATE]=@update_date where [SN] = @material_card_code_superior;

修改后

declare @select_sql nvarchar(200)= 'SELECT SN_STATUS,UPDATE_STATUS,UPDATE_DATE FROM MES.TM_SN_STATUS WHERE SN = '''''+@material_card_code_superior+'''''';
declare @update_sql nvarchar(500)='UPDATE OPENQUERY (SITEMES, '''+@select_sql+''') SET SN_STATUS = '''+@card_status_superior+''',UPDATE_STATUS=''1'',UPDATE_DATE='''+@update_date+'''';
--print @update_sql
exec (@update_sql);

 

posted @ 2022-07-01 17:11  单纯的桃子  阅读(1136)  评论(0编辑  收藏  举报