【问题标题】:Using IF and UPDATE in a PROCEDURE in PLSQL在 PLSQL 的 PROCEDURE 中使用 IF 和 UPDATE
【发布时间】:2020-07-13 12:35:00
【问题描述】:

我是 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;

【问题讨论】:

    标签: oracle plsql procedure


    【解决方案1】:

    试试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;
    

    【讨论】:

      【解决方案2】:

      我认为 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;
      

      结束;

      再次,只是为了完整性。 MERGE 是一个更好的解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-24
        • 2016-06-12
        • 1970-01-01
        • 2012-05-08
        • 2010-11-12
        • 1970-01-01
        相关资源
        最近更新 更多