Using IF and UPDATE in a PROCEDURE to update a table

Asked

Viewed 137 times

1

I am new in SQL and PLSQL and I am having difficulty with the following situation:

create or replace PROCEDURE set_value(p_variable VARCHAR2, p_value VARCHAR2) IS

BEGIN
    INSERT INTO co_t_conf (nome_variavel,valor_variavel) values (p_variavel, p_valor);
    
     --Eu preciso atualizar o nome_variavel se o valor p_variavel inserido for um valor 
       já existente na tabela co_t_conf. Como posso usar um IF e um UPDATE nessa situação?

    COMMIT;
END;
  • You evaluated the use of UPSERT?

3 answers

1

The most correct in your case would be to use the command MERGE. He treats exactly what you’re trying to do.

Basically it works like this:

You do JOIN of the main table with itself searching the key data. If this Join finds something, you can update the values, otherwise you can enter them.

Example:

CREATE OR REPLACE PROCEDURE set_valor(p_variavel VARCHAR2, p_valor VARCHAR2) IS
BEGIN  

  MERGE INTO co_t_conf t1
       USING (SELECT chave_da_tabela 
                FROM co_t_conf 
               WHERE nome_variavel = p_variavel) t2
          ON (t1.chave_da_tabela     = t2.chave_da_tabela)
        WHEN MATCHED THEN
          UPDATE 
             SET nome_variavel  = p_variavel
                ,valor_variavel = p_valor
        WHEN NOT MATCHED THEN
          INSERT (nome_variavel,
                  valor_variavel)
          VALUES (p_nome_variavel,
                  p_valor_variavel);
                  
END;

Documentation about this command can be found here.

1

DECLARE
v_tem number;    
BEGIN
        select 1 into v_tem from co_t_conf where p_variavel = chave_da_tabela;
        
        if v_tem then 
        UPDATE 
        else
        INSERT
        end if;
         --Eu preciso atualizar o nome_variavel se o valor p_variavel inserido for um valor 
         --já existente na tabela co_t_conf. Como posso usar um IF e um UPDATE nessa situação?
    
        COMMIT;
    END;

First of a select on the table and check if the guy already exists, play it in a variable, if you see the guy do an if passing update, if you don’t see him do his Insert...

1

One way , tries to change , if nothing is affected if Inserts.

BEGIN
    -- supondo nome_variavel a PK data tabela
    UPDATE co_t_conf SET valor_variavel = p_valor
    WHERE nome_variavel = p_variavel;
    IF sql%ROWCOUNT = 0 THEN --LINHAS AFETADAS
      INSERT INTO co_t_conf (nome_variavel,valor_variavel) values (p_variavel, p_valor);
    END IF;
    COMMIT;
END;

Browser other questions tagged

You are not signed in. Login or sign up in order to post.