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

#168320
Avatar photoJosé Laurindo Chiappa
Moderador

    Comentando, depois de criar as tabelas, na hora de inserir, primeiro peguei um erro nos INSERTs da SGI5_TAB_CUS_RET_RAT :

    insert into SGI5_TAB_CUS_RET_RAT (CUS_FAM, CUS_DMO, CUS_DIA, CUS_PDI, CUS_PAC, CUS_PPO, CUS_VLT_RTO, CUS_VLU_RTO, CUS_VLT_RMO, CUS_VLU_RMO, CUS_DIP, CUS_DFI, CUS_SEM, CUS_MES)
    values (3011, to_date(’21-07-2023′, ‘dd-mm-yyyy’), 0, 0, 0, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, to_date(’25-07-2023 09:29:09′, ‘dd-mm-yyyy hh24:mi:ss’), to_date(’25-07-2023 09:29:15′, ‘dd-mm-yyyy hh24:mi:ss’), 202329, 202307)
    Erro na Linha de Comandos : 45 Coluna : 159
    Relatório de erros –
    Erro de SQL: ORA-54013: A operação INSERT não é permitida em colunas virtuais
    54013. 0000 – “INSERT operation disallowed on virtual columns”
    *Cause: Attempted to insert values into a virtual column
    *Action: Re-issue the statment without providing values for a virtual column

    ==> E REALMENTE , ollando com mais vagar o CREATE eu vi que vc TEM SIM CÓDIGO EXTRA na forma de DEFAULTs para as colunas CUS_SEM e CUS_MES….
    INCLUSIVE, VALE MUITO A PENA olharmos com mais vagar esse erro : a tabela tem esta estrutura aqui :

    COLUMN_NAME DATA_TYPE NULLABLE, DATA_DEFAULT COLUMN_ID
    CUS_FAM NUMBER No 1
    CUS_DMO DATE No 2
    CUS_DIA NUMBER(4,0) Yes 0 3
    CUS_PDI NUMBER(10,0) Yes 0 4
    CUS_PAC NUMBER(10,0) Yes 0 5
    CUS_PPO NUMBER(20,6) Yes 0 6
    CUS_VLT_RTO NUMBER(20,6) Yes 0 7
    CUS_VLU_RTO NUMBER(20,6) Yes 0 8
    CUS_VLT_RMO NUMBER(20,6) Yes 0 9
    CUS_VLU_RMO NUMBER(20,6) Yes 0 10
    CUS_DIP DATE Yes 11
    CUS_DFI DATE Yes 12
    CUS_SEM NUMBER Yes TO_NUMBER(TO_CHAR(“CUS_DMO”,’YYYYWW’)) 13
    CUS_MES NUMBER Yes TO_NUMBER(TO_CHAR(“CUS_DMO”,’YYYYMM’)) 14

    não parece ser a sua causa de erro, MAS faz TODO O SENTIDO o erro : isso que vc criou com o coluna AS (expressão) é uma coluna Virtual, não deveria estar presente numa carga de dados, ela é sempre Calculada… Tá bem, Corrigi isso rodando os INSERTs para uma tabela temporária/de trabalho e depois pra tabela definitiva, MAS isso não são simples tabelas escalares, vc tem SIM código extra envolvido : repito, NÂO PARECE TER NADA A VER com o erro em questão, MAS é um ponto de alerta, isso Não Pode ser Esquecido em NENHUMA operação de INSERT que vc vá fazer nessa tabela…

    Continuando, os INSERTs na SGI5_TAB_CUS_REP_RAT alguns apresentaram erros tipo :

    Erro a partir da linha : 1.414 no comando –
    insert into SGI5_TAB_CUS_REP_RAT (CUS_FAM, CUS_DTA, CUS_DIA, CUS_PRO, CUS_PPO, CUS_VLT_RTO, CUS_VLU_RTO, CUS_VLT_RMO, CUS_VLU_RMO, CUS_USU, CUS_DUA, CUS_DBA)
    values (3060, to_date(’01-11-2021′, ‘dd-mm-yyyy’), 0, 0, 0.000000, 640503.000000, 3.889800, 311624.000000, 1.892500, 9001, to_date(’22-11-2021 15:04:25′, ‘dd-mm-yyyy hh24:mi:ss’), 30/12/1899)
    Erro na Linha de Comandos : 1.415 Coluna : 186
    Relatório de erros –
    Erro de SQL: ORA-00932: tipos de dados inconsistentes: esperava DATE obteve NUMBER
    00932. 00000 – “inconsistent datatypes: expected %s got %s”
    *Cause:
    *Action:==> OU SEJA, a tool que vc usou pra extrair os INSERTs falhou, pelo jeito, e trouxe um valor 30/12/1899 que é completamente Absurdo, Tanto por não ter aspas quanto pela tool não ter reconhecido a coluna CUS_DBA como DATE, que ela é :

    SCOTT@xepdb1::CONTAINER=XEPDB1> @desc SGI5_TAB_CUS_REP_RAT
    Nome Nulo? Tipo


    CUS_FAM NOT NULL NUMBER
    CUS_DTA NOT NULL DATE
    CUS_DIA NUMBER(4)
    CUS_PRO NUMBER(20)
    CUS_PPO NUMBER(20,6)
    CUS_VLT_RTO NUMBER(20,6)
    CUS_VLU_RTO NUMBER(20,6)
    CUS_VLT_RMO NUMBER(20,6)
    CUS_VLU_RMO NUMBER(20,6)
    CUS_USU NUMBER
    CUS_DUA DATE
    CUS_DBA DATE

    SCOTT@xepdb1::CONTAINER=XEPDB1>

    => corrigi isso alterando o valor no texto via editr de texto, mas fica a obs como um ponto adicional… Continuando, aí sim executo o SQL isoladamente, SEM estar dentro de MERGE, e TIRANDO aquele monte de lixos de TO_CHAR/TO_DATE desnecessários – só não entendi esse “-1” que tinha depois do parêntesis final do LEAD :

    … LEAD(A.CUS_DTA,1) OVER (PARTITION BY A.CUS_FAM ORDER BY A.CUS_FAM, A.CUS_DTA) – 1, TRUNC(sysdate….

    => isso é algo questionável em termos de lógica, mas Ok : mesmo se o LEAD trouxer um NULL , NULL – 1 retornal NULL, o sysdate troca o null por outra coisa, mas vou colocar sem ele o select :