【问题标题】:Unable to fetch data from SQL Server linked server from oracle无法从 oracle 的 SQL Server 链接服务器获取数据
【发布时间】:2016-12-19 19:51:18
【问题描述】:

我们正在将 SQL Server 2005 升级到带有 Windows Server 2012 的 SQL Server 2014。

我们在 SQL Server 中链接服务器以连接到 oracle 以获取数据,并且在旧环境中我们使用 MSDAORA 提供程序。

但是在新环境中安装 Oracle 客户端时,我们没有获得 MSDAORA Provider。

当谷歌搜索发现此“MSDAORA”提供程序已被弃用时。所以我们正在尝试使用 ORAOLEDB.ORACLE 获取数据。

在使用链接服务器从 oracle 调用存储过程时,出现以下错误。

返回链接服务器“NPMSE”的 OLE DB 提供程序“ORAOLEDB.Oracle” 消息“ORA-06550:第 1 行,第 8 列:

PLS-00306:调用中的参数数量或类型错误 'GETNEWINFOPROJECT'

ORA-06550:第 1 行,第 8 列:

PL/SQL:语句被忽略”。

消息 7215,第 17 级,状态 1,第 1 行

无法在远程服务器“NPMSE”上执行语句

但是在旧环境(使用 MSDAORA)中执行相同的存储过程时,我们得到了预期的结果。

以下是来自 Oracle 的存储过程代码。

PROCEDURE GETNEWINFOPROJECT
    ( i_projectname    IN  PROJECT.NAME%TYPE
      , i_locationname IN  LOCATION.NAME%TYPE
      , o_newObject_cursor OUT PKGAPPCMOR.R_CURSOR )
AS
     huge Business logic
END GETNEWINFOPROJECT;

我们怀疑可能是 (o_newObject_cursor OUT PKGAPPCMOR.R_CURSOR ) 导致了问题。

以不同的方式尝试。

  1. 下载“MSDAORA”并尝试安装没有成功。

  2. 在链接服务器中放置“inProcess”不起作用。

  3. 现在我们怀疑 OLEDB ORA 与我们在 Oracle 中使用的任何数据类型都不兼容。

因此我们的时间不多了,需要专家的建议来找出问题所在,如果有人遇到这个问题,请回复。

我们将非常感谢您的帮助。

提前致谢。

下面是我的链接服务器脚本:

IF  EXISTS (SELECT srv.name FROM sys.servers srv WHERE srv.server_id != 0 AND srv.name = N'NPMSE')EXEC master.dbo.sp_dropserver @server=N'NPMSE', @droplogins='droplogins'
GO

/ Object:  LinkedServer [NPMSE]    Script Date: 12/16/2016 17:15:37 /
EXEC master.dbo.sp_addlinkedserver @server = N'NPMSE', @srvproduct=N'Oracle', @provider=N'ORAOLEDB.Oracle', @datasrc=N'xxx', @provstr=N'UID=xxx;PWD=xxx'
 / For security reasons the linked server remote logins password is changed with ######## /
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'NPMSE',@useself=N'False',@locallogin=NULL,@rmtuser=N'xxx',@rmtpassword='########'

GO

EXEC master.dbo.sp_serveroption @server=N'NPMSE', @optname=N'collation compatible', @optvalue=N'false'
GO

EXEC master.dbo.sp_serveroption @server=N'NPMSE', @optname=N'data access', @optvalue=N'true'
GO

EXEC master.dbo.sp_serveroption @server=N'NPMSE', @optname=N'dist', @optvalue=N'false'
GO

EXEC master.dbo.sp_serveroption @server=N'NPMSE', @optname=N'pub', @optvalue=N'false'
GO

EXEC master.dbo.sp_serveroption @server=N'NPMSE', @optname=N'rpc', @optvalue=N'true'
GO

EXEC master.dbo.sp_serveroption @server=N'NPMSE', @optname=N'rpc out', @optvalue=N'true'
GO

EXEC master.dbo.sp_serveroption @server=N'NPMSE', @optname=N'sub', @optvalue=N'false'
GO

EXEC master.dbo.sp_serveroption @server=N'NPMSE', @optname=N'connect timeout', @optvalue=N'0'
GO

EXEC master.dbo.sp_serveroption @server=N'NPMSE', @optname=N'collation name', @optvalue=null
GO

EXEC master.dbo.sp_serveroption @server=N'NPMSE', @optname=N'lazy schema validation', @optvalue=N'false'
GO

EXEC master.dbo.sp_serveroption @server=N'NPMSE', @optname=N'query timeout', @optvalue=N'0'
GO

EXEC master.dbo.sp_serveroption @server=N'NPMSE', @optname=N'use remote collation', @optvalue=N'true'
GO

EXEC master.dbo.sp_serveroption @server=N'NPMSE', @optname=N'remote proc transaction promotion', @optvalue=N'true'
GO

我们正在使用此查询从 SQL Server 调用存储过程。

EXEC( ' BEGIN NPMSE_INTERFACE.PKGAPP.GETNEWINFOPROJECT(''LB1735'',''TORO'');END;' ) ATNPMSE;

并出现错误:

链接服务器“NPMSE”的 OLE DB 提供程序“ORAOLEDB.Oracle”返回消息“ORA-06550:第 1 行,第 8 列:

PLS-00306:调用“GETNEWINFOPROJECT”时参数的数量或类型错误

ORA-06550:第 1 行,第 8 列:

PL/SQL:语句被忽略”。

消息 7215,第 17 层,状态 1,第 1 行
无法在远程服务器 'NPMSE' 上执行语句

【问题讨论】:

  • 尊敬的专家,请提出建议。

标签: sql-server-2012 linked-server


【解决方案1】:

将来可能对其他人有所帮助。

exec sp_addlinkedserver @server=N'MyOracle',
        @srvproduct='Oracle', 
        @provider= 'ORAOLEDB.Oracle', 
        @datasrc= N'//10.0.0.22/xe', 
        @provstr= N'FetchSize=2000;PLSQLRSet=1'

你需要通过以下方式调用oracle sp。

EXEC( '{CALL HR.GETNEWINFOPROJECT(''LB1735'',''TORO'')}' ) at MyOracle;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-19
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多