Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Função Oracle para atualizar uma tabela, se o registro for nulo, INSERT


Tudo que você precisa é MERGE declaração. Ambos os seus requisitos podem ser feitos de uma só vez.

A sintaxe é -
MERGE INTO table_a a
  USING table_b b
    ON (a.column= b.column)
  WHEN MATCHED THEN
    UPDATE SET a.column= b.column
  WHEN NOT MATCHED THEN
    INSERT (column1, column2)
    VALUES (b.val1, b.val2);

Atualizar Exemplo para mostrar a cláusula USING para parâmetros de procedimento
USING(
SELECT
p_HEAD_MARK hm, 
p_PROJECT_NAME pn, 
p_COLI_NUM cn, 
p_ONSITE_UPD_QTY ouq
FROM DUAL) s

Use-os como s.hm, s.pn, s.cn, s.ouq

Atualização 2 Um caso de teste completo

Digamos que eu tenha uma tabela emp1 sem filas. Eu crio um procedimento que leva ename como INPUT, que usarei para inserir em emp tabela usando MERGE .
SQL> SELECT * FROM emp1;

no rows selected

SQL>
SQL> CREATE OR REPLACE
  2  PROCEDURE p(
  3      p_ename IN VARCHAR2)
  4  AS
  5  BEGIN
  6    MERGE INTO emp1 e USING
  7    (SELECT p_ename AS ename FROM dual
  8    ) s ON(e.ename = s.ename)
  9  WHEN MATCHED THEN
 10    UPDATE SET e.empno = 100 WHEN NOT MATCHED THEN
 11    INSERT
 12      (ename
 13      ) VALUES
 14      (s.ename
 15      );
 16  END;
 17  /

Procedure created.

SQL>
SQL> sho err
No errors.
SQL>
SQL> BEGIN
  2    p('SCOTT');
  3  END;
  4  /

PL/SQL procedure successfully completed.

SQL>

Vamos ver se o valor foi inserido.
SQL> SELECT ename FROM emp1;

ENAME
----------
SCOTT

SQL>