链接服务器的 ODAC OLE DB 提供程序“OraOLEDB.Oracle”为列提供了不一致的元数据

Bat*_*ech 5 sql-server linked-server sql-server-2014

我使用 SQL Server 2014 链接服务器连接到 Oracle 11gR2 (11.2.0.3) 数据库,使用 ODAC 12.1.0.2.4 Oracle OLE DB 提供程序。我有一个存储过程,它位于 SQL 2014 数据库中,并使用以下语法通过链接服务器将本地表中的数据插入到远程 Oracle 表中:

insert into LinkedServerName..RemoteSchema.RemoteTable(column) 
select column from localSQLServerTable
Run Code Online (Sandbox Code Playgroud)

但是,我在插入行中收到以下错误:

消息 7356,级别 16,状态 1,过程 {MyProcName},第 1 行链接服务器“{MyLinkedServer}”的 OLE DB 提供程序“OraOLEDB.Oracle”为列提供了不一致的元数据。据报告,对象“{remote table name}”的列“{columnName}”(编译时序数为 23)在编译时的“DBCOLUMNFLAGS_ISFIXEDLENGTH”为 16,在运行时为 0。

有问题的列在 Oracle 中定义为CHAR(1 BYTE)数据类型。

安装了“64 位 ODAC 12c 第 4 版 (12.1.0.2.4) Xcopy for Windows x64”,从http://www.oracle.com/technetwork/database/windows/downloads/index-下载名称“ODAC121024Xcopy_x64.zip” 090165.html

Bat*_*ech 5

尽管 Oracle 支持说明 207303.1 指出 12c 客户端可与 11gR2 客户端一起使用,但此错误似乎是由 2 个不同版本之间的兼容性问题引起的。为了解决这个问题,我按照以下步骤操作:

  1. 卸载 12c ODAC 版本,方法是打开 Admin 命令提示符,将目录更改为已安装的 Oracle 主文件夹,然后运行:uninstall.bat all d:\oracle,其中 d:\oracle 是我的 Oracle 主位置。
  2. 删除PATH环境变量
  3. 重启
  4. 安装 11.2.0.4 ODAC 版本“64-bit ODAC 11.2 Release 6 (11.2.0.4.0) Xcopy for Windows x64”,下载“ODAC112040Xcopy_64bit.zip”选项。确保通过管理员命令提示符进行安装(安装命令是:)install.bat all d:\oracle11gr2 odac11gr2。下载地址:http : //www.oracle.com/technetwork/database/windows/downloads/index-090165.html
  5. 添加回 PATH 环境变量 d:\oracle11gr2;d:\oracle11gr2\bin
  6. 再次重启


Bao*_*dad 5

在 SQL Server Management Studio(SQL Server 2012 实例)中,我使用 12c ODAC Provider 创建了一个指向 Oracle 12c 数据库的链接服务器。

我在尝试以这种方式从 Oracle 数据库查询表时遇到了“链接服务器的 OLE DB 提供程序“OraOLEDB.Oracle”[???] 为列提供了不一致的元数据...”错误SELECT * FROM [LINKEDSERVER]..[SCHEMA].[TABLE]

我尝试安装版本 11 ODAC 提供程序,但仍然得到相同的结果。

对我有用的是仔细阅读错误消息,找出导致错误的列,然后在 Oracle 端对这些列进行 CAST 或更改为不同的数据类型。有一次,我必须将列从 NUMBER(?,0) 更改为 INT 或 DECIMAL(?,X),其中 X 大于零。还有一次,我不得不将 CHAR(6) 更改为 VARCHAR(6) 才能得到它。

其他人成功地使用了OPENQUERY一种解决方法,如果我们没有能力调整 Oracle 端的列数据类型,这可能是我们唯一的选择。

我确信有人拥有专业技术知识可以更深入地研究这个问题,但我的感觉是错误在于 SQL Server 和 Oracle 数据提供程序之间的相互作用。甲骨文和微软彼此并不完全友好,或者倾向于为了我们用户的利益而互相帮助。