Pular para o conteúdo

Fóruns Banco de dados Oracle Erro na execução de MERGE Responder a: Erro na execução de MERGE

#168014
ESSanches
Participante

    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;