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);