Использование IF и UPDATE в ПРОЦЕДУРЕ в PLSQL - PullRequest
0 голосов
/ 13 июля 2020

Я новичок в SQL и PL / SQL, и у меня возникают некоторые трудности в этой ситуации:

create or replace PROCEDURE set_valor(p_variavel VARCHAR2, p_valor VARCHAR2) IS
BEGIN
  INSERT INTO co_t_conf (nome_variavel,valor_variavel) values (p_variavel, p_valor);
        
  /* I need to update nome_variavel if p_variavel is an already existent variable. 
    How can i do a 'IF' and 'UPDATE' in this situation?)
 */
  
  COMMIT;
END;

Ответы [ 2 ]

2 голосов
/ 13 июля 2020

Попробуйте merge, который также называется upsert , поскольку он может обновлять и вставлять значения в один и тот же оператор. Примерно так:

create or replace procedure set_valor 
  (p_variavel in varchar2, 
   p_valor in varchar2
  ) 
is    
begin
  merge into co_t_conf c
    using (select p_variavel, 
                  p_valor
           from dual
          ) x
    on (c.nome_variavel = x.p_variavel)
    when matched     then update set 
                            c.valor_variavel = x.p_valor
    when not matched then insert (nome_variavel, valor_variavel)
                          values (x.p_variavel, x.p_valor);
end;
0 голосов
/ 13 июля 2020

Я думаю, что MERGE - лучшее решение, но для полноты (и, чтобы избежать ужасного IF..THEN..ELSE, вы также можете использовать это:

create or replace PROCEDURE set_valor(p_variavel VARCHAR2, p_valor VARCHAR2) IS
BEGIN
  BEGIN
  INSERT INTO co_t_conf (nome_variavel,valor_variavel) values (p_variavel, p_valor);

  EXCEPTION
    WHEN dup_val_on_index THEN
         UPDATE co_t_conf SET valor_variavel = p_valor WHERE none_variavel = p_variavel;
  END; 

  COMMIT;

END;

Опять же, просто для полноты картины. MERGE - гораздо лучшее решение.

...