› Fóruns › Banco de dados Oracle › Erro na execução de MERGE › Responder a: Erro na execução de MERGE
Bom dia Chiappa, muito obrigado pela resposta! Vamos lá. Você tem toda razão, meu código esta bem confuso, realmente
não é necessário transformar implicitamente uma data em uma data!!! Como fiz no código abaixo:
TO_DATE(NVL(TO_CHAR(LEAD(A.CUS_DTA,1) OVER (PARTITION BY A.CUS_FAM
ORDER BY A.CUS_FAM,
A.CUS_DTA) - 1,'DD/MM/YYYY'),
TO_CHAR(TRUNC(SYSDATE),'DD/MM/YYYY')),
'DD/MM/YYYY')
O problema é que tentei colocar o código abaixo, esse sim sem conversões implícitas desnecessárias, segue o código abaixo:
NVL(LEAD(A.CUS_DTA,1) OVER (PARTITION BY A.CUS_FAM
ORDER BY A.CUS_FAM,
A.CUS_DTA) - 1,TRUNC(SYSDATE))
Mas é exatamente ai que esta o problemas, essa chamada a função LEAD, quando executada como um bloco, funciona perfeitamente, mas quando eu a coloco
dentro de um comando MERGE gera o erro mencionado na postagem inicial.
O que fiz no código que vc citou foi uma completa gambiarra pra fazer o código funcionar, portando o código com muitas conversões implícitas É O QUE FUNCIONA.
Gostaria de saber, se for possível, pq o código sem conversões implícitas NAO funciona. Como vc mesmo disse, não existe possibilidade da função LEAD retornar um numero de uma coluna definida como data.
Segue o describe das tabelas, como pedido. Não enviei o create table e o insert de dados pq nao sei como colocar um arquivo anexo aqui…
SQL> desc SGI5_TAB_CUS_REP_RAT
Name Type Nullable Default Comments
CUS_FAM NUMBER Familia
CUS_DTA DATE Dta do rateio
CUS_DIA NUMBER(4) Y 0 Dias de producao usados no calculo
CUS_PRO NUMBER(20) Y 0 Qtde produzida
CUS_PPO NUMBER(20,6) Y 0 Producao ponderada
CUS_VLT_RTO NUMBER(20,6) Y 0 Vlr total do rateio total
CUS_VLU_RTO NUMBER(20,6) Y 0 Vlr unitario do rateio total
CUS_VLT_RMO NUMBER(20,6) Y 0 Vlr total do rateio de mao de obra
CUS_VLU_RMO NUMBER(20,6) Y 0 Vlr unitario do rateio de mao de obra
CUS_USU NUMBER Y null Usuario da ultima atualizacao
CUS_DUA DATE Y null Data da ultima atualizacao
CUS_DBA DATE Y Data base atualizacao
SQL> desc SGI5_TAB_CUS_RET_RAT
Name Type Nullable Default Comments
CUS_FAM NUMBER Familia
CUS_DMO DATE Dta do movto
CUS_DIA NUMBER(4) Y 0 Dias processados
CUS_PDI NUMBER(10) Y 0 Producao diaria
CUS_PAC NUMBER(10) Y 0 Producao acumulada nos ultimos X dias
CUS_PPO NUMBER(20,6) Y 0 Producao ponderada
CUS_VLT_RTO NUMBER(20,6) Y 0 Vlr total do rateio total
CUS_VLU_RTO NUMBER(20,6) Y 0 Vlr unitario do rateio total
CUS_VLT_RMO NUMBER(20,6) Y 0 Vlr total do rateio de mao de obra
CUS_VLU_RMO NUMBER(20,6) Y 0 Vlr unitario do rateio de mao de obra
CUS_DIP DATE Y Dta de inicio do processamento
CUS_DFI DATE Y Dta de fim do processamento
CUS_SEM NUMBER Y TO_NUMBER(TO_CHAR(“CUS_DMO”,’YYYYWW’)) Ano/Semana do movto
CUS_MES NUMBER Y TO_NUMBER(TO_CHAR(“CUS_DMO”,’YYYYMM’)) Ano/Mes do movto
Espero te me expressado um pouco melhor agora e muitíssimo obrigado pela atenção.
Emerson
PS: Segue o código do comando MERGE que NÃO esta funcionando. Veja que não existe NENHUMA conversão de data implícita nele.
MERGE INTO SGI5_TAB_CUS_RET_RAT X
USING(
SELECT A.CUS_FAM FAM,
A.CUS_DTA DMO_INI,
NVL(LEAD(A.CUS_DTA,1) OVER (PARTITION BY A.CUS_FAM
ORDER BY A.CUS_FAM,
A.CUS_DTA) - 1,TRUNC(SYSDATE)) DMO_FIN,
A.CUS_VLT_RTO VLT_RTO,
A.CUS_VLU_RTO VLU_RTO,
A.CUS_VLT_RMO VLT_RMO,
A.CUS_VLU_RMO VLU_RMO
FROM SGI5_TAB_CUS_REP_RAT A
WHERE A.CUS_DTA >= &V_DTA
) Y ON (X.CUS_FAM = Y.FAM AND
X.CUS_DMO BETWEEN Y.DMO_INI AND Y.DMO_FIN)
WHEN MATCHED THEN
UPDATE SET X.CUS_VLT_RTO = Y.VLT_RTO,
X.CUS_VLU_RTO = Y.VLU_RTO,
X.CUS_VLT_RMO = Y.VLT_RMO,
X.CUS_VLU_RMO = Y.VLU_RMO;