Tenho uma função no SQL Server 2019 que copia dados de uma tabela local para uma tabela Oracle 11.2.0.4 via Linked Server, utilizando cliente Oracle 19.3. Recentemente, uma nova coluna foi adicionada à tabela Oracle, então atualizei a função insert para incluir essa nova coluna.
Agora, sempre que eu modificar a função, ela será executada com sucesso uma vez e apenas uma vez. Se eu limpar o cache de consulta, ele também será executado uma vez e começará a gerar o erro a partir de então. TODAS as tentativas de execução após a primeira vez lançam este erro:
Msg 7353, nível 16, estado 1, procedimento COD.Interface_Upload, linha 29 [Batch Start Line 20] O provedor OLE DB "OraOLEDB.Oracle" para o servidor vinculado "ORADEV-LINK" forneceu metadados inconsistentes. Uma coluna extra foi fornecida durante a execução que não foi encontrada em tempo de compilação.
A única alteração neste procedimento da versão anterior, de trabalho, é adicionar o campo DATE_SUBMITTED e a parte "select min([Sample_date]) ..." para fornecer essa coluna.
Tudo o que posso encontrar diz que, se você estiver recebendo erros de metadados, vá para a sintaxe OPENQUERY, que é o que estou usando.
A função é:
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
A definição da tabela de destino do 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
A definição da tabela de origem do 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
Usar
OPTION (RECOMPILE)
noINSERT
Acontece que esse problema é um bug do Oracle. O patch 31892754: 19C OLEDB PROVIDER EXECUDER FALHA COM METADADOS INCONSISTENTES EM UM LINKED SERVER resolve esse problema.
Requer Oracle 19.3 e CU 31247621 (mas não CUs mais recentes que isso).
A Oracle diz que este patch será incluído no Oracle 19.11, então estou assumindo que é uma CU com vencimento em 2021.