无法从oracle

时间:2016-12-16 12:25:30

标签: sql-server-2012 linked-server

我们正在使用Windows Server 2012将SQL Server 2005升级到SQL Server 2014。

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

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

当谷歌搜索发现这个" MSDAORA"提供者已弃用。所以我们尝试使用ORAOLEDB.ORACLE获取数据。

使用链接服务器从oracle调用存储过程时,我们收到以下错误。

  

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

     

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

     

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

     

PL / SQL:语句被忽略"。

     

Msg 7215,Level 17,State 1,Line 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中使用的任何数据类型都不兼容。

  4. 因此我们已经没时间了,需要专家建议来指出问题,如果有任何机构面对这个问题,请回复此事。

    我们非常感谢您的帮助。

    提前致谢。

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

    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;
    

    并收到错误:

      

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

         

    PLS-00306:调用' GETNEWINFOPROJECT'

    时参数的数量或类型错误      

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

         

    PL / SQL:语句被忽略"。

         

    Msg 7215,Level 17,State 1,Line 1
      无法在远程服务器上执行语句' NPMSE'

1 个答案:

答案 0 :(得分:2)

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

>>> output
[(10, 7), (7, 13), (13, 4), (4, 9), (9, 10)]

你需要以下面的方式调用oracle sp。

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