Oracle
 sql >> Base de données >  >> RDS >> Oracle

Fonction Oracle pour mettre à jour une table, si l'enregistrement est nul, alors INSERT

Tout ce dont vous avez besoin est FUSIONNER déclaration. Vos deux exigences peuvent être satisfaites en une seule fois.

La syntaxe est -

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

Mettre à jour Exemple d'affichage de la clause USING pour les paramètres de procédure

USING(
SELECT
p_HEAD_MARK hm, 
p_PROJECT_NAME pn, 
p_COLI_NUM cn, 
p_ONSITE_UPD_QTY ouq
FROM DUAL) s

Utilisez-les comme s.hm, s.pn, s.cn, s.ouq

Mise à jour 2 Un cas de test complet

Disons que j'ai une table emp1 sans rangées. Je crée une procédure qui prend ename comme INPUT, que je vais utiliser pour insérer dans emp table en utilisant 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>

Voyons si la valeur a été insérée.

SQL> SELECT ename FROM emp1;

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

SQL>