AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 79332898
Accepted
hud
hud
Asked: 2025-01-06 19:34:59 +0800 CST2025-01-06 19:34:59 +0800 CST 2025-01-06 19:34:59 +0800 CST

Dados não estão sendo atualizados via procedimento armazenado no Oracle

  • 772

Eu escrevi um procedimento armazenado onde, com base no SAP_ID, atualizarei os dados na tabela, se os dados para isso SAP_IDjá existirem, caso contrário, eu INSERTos atualizarei.

Esta é a minha pergunta:

PROCEDURE INSERT_PF_EXCEL_DATA_IPCOLO (
        p_political_state_name         IN NVARCHAR2,
        p_political_state_code         IN NVARCHAR2,
        p_rfcdate                      IN NVARCHAR2,
        p_rfs_date                     IN NVARCHAR2,
        p_rfe1_date                    IN NVARCHAR2,
        p_site_drop_date               IN NVARCHAR2,
        p_ip_colo_siteid               IN NVARCHAR2,
        p_mw_installed                 IN NVARCHAR2,
        p_dg_nondg                     IN NVARCHAR2,
        p_eb_noneb                     IN NVARCHAR2,
        p_id_od_countchange            IN NVARCHAR2,
        p_id_od_changeddate            IN NVARCHAR2,
        p_rrh_countchange              IN NVARCHAR2,
        p_rrh_changeddate              IN NVARCHAR2,
        p_tenancy_countchange          IN NVARCHAR2,
        p_tenancy_changeddate          IN NVARCHAR2,
        p_sap_id                       IN NVARCHAR2,
        p_created_by                   IN NVARCHAR2,
        p_rfs_date_5g                  IN NVARCHAR2,
        p_drop_date_5g                 IN NVARCHAR2,
        p_olt_count                    IN NUMBER,
        p_olt_change_date              IN NVARCHAR2,
        p_diesel_downtime_minutes      IN NVARCHAR2,
        p_overall_infra_outage_minutes IN NVARCHAR2,
        p_diesel_downtime_min_my       IN NVARCHAR2,
        p_overall_infra_outage_min_my  IN NVARCHAR2,
        p_is5gpresent                  IN NVARCHAR2,
        p_is_site_dropped              IN NVARCHAR2,
        p_status                       OUT NVARCHAR2,
        p_message                      OUT NVARCHAR2
    ) AS
        t_cnt           NUMBER;
        vcnt_sapid      NUMBER;
        v_ipcolobilling VARCHAR2(25) := 'IpColoBilling';
    BEGIN

  --  DELETE FROM APP_LOG WHERE APP_NAME = 'IpColoBilling' AND TRUNC(LOG_TIME) = TRUNC(SYSDATE - 2);

        DELETE FROM app_log
        WHERE
                app_name = v_ipcolobilling
            AND ( log_time ) >= trunc(sysdate - 2)
            AND log_time < trunc(sysdate - 1);

        COMMIT;
        
        SELECT count(sap_id) INTO vcnt_sapid FROM temp_ipcolo_billing_mst
        WHERE
            sap_id = p_sap_id;-- AND CREATED_DATE = SYSDATE;


        IF vcnt_sapid > 0 THEN
            UPDATE temp_ipcolo_billing_mst
SET
    political_state_name = p_political_state_name,
    political_state_code = p_political_state_code,
    rfcdate = TO_DATE(p_rfcdate, 'DD-MM-YYYY'), -- Truncates to the day
    rfs_date = TO_DATE(p_rfs_date, 'DD-MM-YYYY'),-- TRUNC(), -- Removed invalid format 'dd-MM-yyyy'
    rfe1_date = TO_DATE(p_rfe1_date, 'DD-MM-YYYY'), -- Removed invalid format 'dd-MM-yyyy'
   site_drop_date = TO_DATE(p_site_drop_date,'DD-MM-YYYY'), -- Removed invalid format 'dd-MM-yyyy'
    ip_colo_siteid = p_ip_colo_siteid,
    mw_installed = p_mw_installed,
    dg_nondg = p_dg_nondg,
    eb_noneb = p_eb_noneb,
    id_od_countchange = p_id_od_countchange,
    id_od_changeddate = TO_DATE(p_id_od_changeddate,'DD-MM-YYYY'), -- Removed invalid format 'dd-MM-yyyy'
    rrh_countchange = p_rrh_countchange,
    rrh_changeddate = TO_DATE(p_rrh_changeddate,'DD-MM-YYYY'), -- Removed invalid format 'dd-MM-yyyy'
    tenancy_countchange = p_tenancy_countchange,
    tenancy_changeddate = TO_DATE(p_tenancy_changeddate,'DD-MM-YYYY'), -- Removed invalid format 'dd-MM-yyyy'
    created_by = p_created_by,
    rfs_date_5g = TO_DATE(p_rfs_date_5g,'DD-MM-YYYY'), -- Removed invalid format 'dd-MM-yyyy'
    drop_date_5g = TO_DATE(p_drop_date_5g,'DD-MM-YYYY'), -- Removed invalid format 'dd-MM-yyyy'
    olt_count = p_olt_count,
    olt_change_date = TO_DATE(p_olt_change_date,'DD-MM-YYYY'), -- Removed invalid format 'dd-MM-yyyy'
    diesel_downtime_minutes = p_diesel_downtime_minutes,
    overall_infra_outage_minutes = p_overall_infra_outage_minutes,
    diesel_downtime_min_my = p_diesel_downtime_min_my,
    overall_infra_outage_min_my = p_overall_infra_outage_min_my,
    is5gpresent = p_is5gpresent,
    is_site_dropped = p_is_site_dropped,
    LAST_UPDATED_DATE = SYSDATE
    
WHERE

    sap_id = p_sap_id;
                
                p_message := 'SUCCESS';

            COMMIT;
        ELSE
            INSERT INTO temp_ipcolo_billing_mst (--TEMP_IPCOLO_BILLING_MST

                id,
                political_state_name,
                political_state_code,
                rfcdate,
                rfs_date,
                rfe1_date,
                site_drop_date,
                ip_colo_siteid,
                mw_installed,
                dg_nondg,
                eb_noneb,
                id_od_countchange,
                id_od_changeddate,
                rrh_countchange,
                rrh_changeddate,
                tenancy_countchange,
                tenancy_changeddate,
                sap_id,
                created_by,
                rfs_date_5g,
                drop_date_5g,
                olt_count,
                olt_change_date,
                diesel_downtime_minutes,
                overall_infra_outage_minutes,
                diesel_downtime_min_my,
                overall_infra_outage_min_my,
                is5gpresent,
                is_site_dropped
            ) VALUES (
                incr_id_ipcolo_temp.NEXTVAL,
                p_political_state_name,
                p_political_state_code,
                to_date(p_rfcdate, 'dd-MM-yyyy'),
                to_date(p_rfs_date, 'dd-MM-yyyy'),
                to_date(p_rfe1_date, 'dd-MM-yyyy'),
                to_date(p_site_drop_date, 'dd-MM-yyyy'),
                p_ip_colo_siteid,
                p_mw_installed,
                p_dg_nondg,
                p_eb_noneb,
                p_id_od_countchange,
                to_date(p_id_od_changeddate, 'dd-MM-yyyy'),
                p_rrh_countchange,
                to_date(p_rrh_changeddate, 'dd-MM-yyyy'),
                p_tenancy_countchange,
                to_date(p_tenancy_changeddate, 'dd-MM-yyyy'),
                p_sap_id,
                p_created_by,
                to_date(p_rfs_date_5g, 'dd-MM-yyyy'),
                to_date(p_drop_date_5g, 'dd-MM-yyyy'),
                p_olt_count,
                to_date(p_olt_change_date, 'dd-MM-yyyy'),
                p_diesel_downtime_minutes,
                p_overall_infra_outage_minutes,
                to_date(p_diesel_downtime_min_my, 'dd-MM-yyyy'), 
                to_date(p_overall_infra_outage_min_my, 'dd-MM-yyyy'),
                p_is5gpresent,
                p_is_site_dropped
            );

            p_message := 'SUCCESS';
        END IF;

    EXCEPTION
        WHEN OTHERS THEN
            p_status := sqlerrm;
            p_message := 'ERROR';
    END INSERT_PF_EXCEL_DATA_IPCOLO;

Onde estou errando?

oracle-database
  • 1 1 respostas
  • 40 Views

1 respostas

  • Voted
  1. Best Answer
    Littlefoot
    2025-01-07T00:00:48+08:002025-01-07T00:00:48+08:00

    Você nunca explicou o que quis dizer ao dizer que o procedimento que você escreveu não funciona. Como você o verificou? Você o executou? Usando quais dados? Você verificou o valor dos OUTparâmetros?

    De qualquer forma: em vez de verificar se a linha já existe (ou não) e escrever instruções updateand separadas, considere usar ; também é conhecido como "upsert", pois combina atualização com inserção e foi desenvolvido para os problemas que você descreveu.insertmerge

    Aqui está um exemplo simplificado (não tive vontade de criar todos esses parâmetros ou colunas de tabela), mas ele deve ilustrar o que estou tentando dizer.

    Tabela de exemplo e sequência:

    SQL> create table temp_ipcolo_billing_mst
      2  (id                   number,
      3   political_state_name varchar2(10),
      4   political_state_code varchar2(10),
      5   rfcdate              date);
    
    Table created.
    
    SQL> create sequence incr_id_ipcolo_temp;
    
    Sequence created.
    

    Procedimento; ele removeu a parte de log do código - inclua-a de volta, se precisar. Basicamente, ele faz o mesmo trabalho que seu procedimento, verificando se P_SAP_IDa linha existe na tabela de destino ou não:

    • se existir, mergeatualizará essa linha
    • caso contrário, ele irá inserir uma nova linha

    Aqui está o código:

    SQL> create or replace procedure insert_pf_excel_data_ipcolo
      2    (p_sap_id               in number,
      3     p_political_state_name in nvarchar2,
      4     p_political_state_code in nvarchar2,
      5     p_rfcdate              in nvarchar2,
      6     p_message             out nvarchar2)
      7  as
      8  begin
      9      merge into temp_ipcolo_billing_mst a
     10      using (select p_sap_id               as sap_id,
     11                    p_political_state_name as political_state_name,
     12                    p_political_state_code as political_state_code,
     13                    to_date(p_rfcdate, 'dd-mm-yyyy')   as rfcdate
     14            from dual
     15           ) b
     16        on (b.sap_id = a.id)
     17      when matched then update set
     18        a.political_state_name = b.political_state_name,
     19        a.political_state_code = b.political_state_code,
     20        a.rfcdate   = b.rfcdate
     21      when not matched then insert
     22        (id,
     23         political_state_name,
     24         political_state_code,
     25         rfcdate)
     26        values
     27        (incr_id_ipcolo_temp.nextval,
     28         b.political_state_name,
     29         b.political_state_code,
     30         b.rfcdate
     31        );
     32
     33    p_message := 'SUCCESS';
     34  exception
     35    when others then
     36      p_message := 'ERROR: ' || sqlerrm;
     37  end;
     38  /
    
    Procedure created.
    

    Vamos testar: o primeiro exemplo roda bem e insere uma linha:

    SQL> set serveroutput on
    SQL> declare
      2    l_msg varchar2(200);
      3  begin
      4    insert_pf_excel_data_ipcolo
      5      (p_sap_id               => 1,
      6       p_political_state_name => 'Pol. name',
      7       p_political_state_code => 'PNC',
      8       p_rfcdate              => '06-01-2025',
      9       p_message              => l_msg);
     10    dbms_output.put_line(l_msg);
     11  end;
     12  /
    SUCCESS
    
    PL/SQL procedure successfully completed.
    
    SQL> select * from temp_ipcolo_billing_mst;
    
            ID POLITICAL_ POLITICAL_ RFCDATE
    ---------- ---------- ---------- ---------
             1 Pol. name  PNC        06-JAN-25
    

    Este exemplo falha devido a um valor de data inválido (e retorna uma mensagem de erro):

    SQL> declare
      2    l_msg varchar2(200);
      3  begin
      4    insert_pf_excel_data_ipcolo
      5      (p_sap_id               => 1,
      6       p_political_state_name => 'Pol. name',
      7       p_political_state_code => 'PNC',
      8       p_rfcdate              => '99-01-2025',
      9       p_message              => l_msg);
     10    dbms_output.put_line(l_msg);
     11  end;
     12  /
    ERROR: ORA-01847: day of month must be between 1 and last day of month
    
    PL/SQL procedure successfully completed.
    

    O exemplo final atualiza a linha existente:

    SQL> declare
      2    l_msg varchar2(200);
      3  begin
      4    insert_pf_excel_data_ipcolo
      5      (p_sap_id               => 1,
      6       p_political_state_name => 'Pol. nameA',
      7       p_political_state_code => 'PNC_A',
      8       p_rfcdate              => '25-08-2025',
      9       p_message              => l_msg);
     10    dbms_output.put_line(l_msg);
     11  end;
     12  /
    SUCCESS
    
    PL/SQL procedure successfully completed.
    
    SQL> select * from temp_ipcolo_billing_mst;
    
            ID POLITICAL_ POLITICAL_ RFCDATE
    ---------- ---------- ---------- ---------
             1 Pol. nameA PNC_A      25-AUG-25
    
    SQL>
    

    Então, sim - funciona. Dê uma olhada mais de perto e - se achar útil - reescreva seu código para que ele faça o mesmo que meu procedimento de exemplo.

    • 2

relate perguntas

  • KeyHolder do Springs, oracle jdbс e insert-query com quebras de linha levam a ORA-00931: identificador ausente

  • Como manter um valor adicional ao usar connect-by no Oracle?

  • Obtendo este erro no oracle 19c ORA-01017: nome de usuário/senha inválidos; logon negado

  • Existe uma tabela de consulta para a coluna ALL_CONSTRAINTS.CONSTRAINT_TYPE no Oracle DB?

  • Erro de procedimento Oracle: UDT esperado obteve CHAR

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve