我在 SQL Server 2019 中有一个函数,它使用 Oracle 19.3 客户端通过链接服务器将数据从本地表复制到 Oracle 11.2.0.4 表。最近,Oracle 表中添加了一个新列,因此我更新了插入函数以包含这个新列。
现在,每当我修改函数时,它都会成功执行一次,并且只执行一次。如果我清除查询缓存,它也会执行一次,然后从那时起开始抛出错误。第一次之后的所有执行尝试都会抛出此错误:
消息 7353,级别 16,状态 1,过程 COD.Interface_Upload,第 29 行 [批处理开始第 20 行] 链接服务器“ORADEV-LINK”的 OLE DB 提供程序“OraOLEDB.Oracle”提供了不一致的元数据。在执行期间提供了一个额外的列,但在编译时未找到。
与以前的工作版本相比,此过程的唯一更改是添加 DATE_SUBMITTED 字段和“select min([Sample_date]) ...”部分以提供该列。
我能找到的所有内容都表明,如果您遇到元数据错误,请转到 OPENQUERY 语法,这就是我正在使用的语法。
功能是:
ALTER Procedure [COD].[Interface_Upload]
As
SET NOCOUNT ON;
INSERT OPENQUERY([ORADEV-LINK], 'SELECT ACCOUNT_NUMBER, FROM_DATE, TO_DATE,
COD_TO_BOD_FACTOR, CONSUMPTION, SAMPLE_DATE, COD_CONTENT, SS_CONTENT,
DATE_SUBMITTED from cbd.WS_CBD_PACS')
Select [Account_Number]
,[From_Date] ,[To_Date]
,[Factor] ,[Consumption]
,[Sample_date] ,[COD]
,[SS]
, ( select min([Sample_date])
from dbo.ORA_Interface
where Account_Number = p.Account_Number )
from dbo.ORA_Interface p ;
Return @@rowcount;
GO
Oracle 目标表定义为:
Null? Type
----------------------- -------- -------
ACCOUNT_NUMBER NOT NULL NUMBER(13)
FROM_DATE NOT NULL DATE
TO_DATE NOT NULL DATE
COD_TO_BOD_FACTOR NOT NULL NUMBER(6,2)
CONSUMPTION NOT NULL NUMBER(15)
SAMPLE_DATE NOT NULL DATE
COD_CONTENT NOT NULL NUMBER(10)
SS_CONTENT NOT NULL NUMBER(10)
DATE_SUBMITTED DATE
SQL Server 源表定义为:
[Account_Number] [varchar](30) NULL,
[From_Date] [datetime] NULL,
[To_Date] [datetime] NULL,
[Factor] [numeric](15, 2) NULL,
[Consumption] [numeric](15, 2) NULL,
[Sample_date] [datetime] NULL,
[COD] [numeric](15, 2) NULL,
[SS] [numeric](15, 2) NULL
使用
OPTION (RECOMPILE)
在INSERT
事实证明,这个问题是一个 Oracle 错误。补丁 31892754:19C OLEDB 提供程序执行失败,链接服务器中的元数据不一致,解决了这个问题。
它需要 Oracle 19.3 和CU 31247621(但没有更新的 CU)。
Oracle 表示此补丁将包含在 Oracle 19.11 中,因此我假设这是 2021 年到期的 CU。