Sunday 15 January 2012

Merge sur Oracle

Oracle: la commande Merge  

Merge help you to update and insert a new record with the same instruction.
the following present the syntax of it.

MERGE INTO Table1 T1
USING (SELECT Id, fields FROM Table2) T2
ON ( T1.Id = T2.Id ) -- Matching condition
WHEN MATCHED THEN -- true
UPDATE SET T1.fields = T2.fields --many fields with separator (,)
WHEN NOT MATCHED THEN -- false
INSERT (T1.ID, T1.fields) VALUES ( T2.ID, T2.fields);

 

Example

 
>SQLPLUS scott/tiger


Oracle Database 10g Release 10.2.0.1.0 - Production

SQL> SET LINESIZE 130
SQL>   CREATE Table product (
  2  Id Number (10),
  3  Ref VARCHAR2 (16),
  4  Price NUMBER (12,2));
SQL> Table created
SQL>CREATE SEQUENCE Seq_Id_Pro START WITH 1 INCREMENT BY 1;

SQL>INSERT INTO product VALUES (Seq_Id_Pro.NextVal, '001',    5.50);
SQL>INSERT INTO product VALUES (Seq_Id_Pro.NextVal, '002',  3.5);
SQL>INSERT INTO product VALUES (Seq_Id_Pro.NextVal, '004',    5.99);

SQL>COMMIT;

--the second table
SQL>  
CREATE Table Temp_Product (
2 Ref VARCHAR2 (16),
3 Price NUMBER (12,2));
SQL> Table created
SQL>INSERT INTO Temp_Product VALUES ('001', 6.99);
SQL>INSERT INTO Temp_Product VALUES ('002',2.5);
SQL>INSERT INTO Temp_Product VALUES ('003', 2.99);
SQL>INSERT INTO Temp_Product VALUES ('004', 5.5);
SQL>INSERT INTO Temp_Product VALUES ('005', 4.9);
SQL>COMMIT;
  
  
SQL>   MERGE INTO Product P
    2  USING (SELECT Ref, price FROM Temp_Product) T
    3   ON (P.Ref = T.Ref)
    4  WHEN MATCHED THEN 
    5  UPDATE SET P.Price = T.Price -- you can other fields 
    6 WHEN NOT MATCHED THEN 
    7  INSERT (P.Id, P.Ref,  P.Price) VALUES (Seq_Id_Pro.NextVal, T.Ref, T.Price);
  
SQL>5 records matched.

--when you do select on table product you will find update of the
   price and a new records inserted.
;

SQL>select * from product;

        ID REF                   PRICE
---------- ---------------- ----------
         1 001                    6,99
         2 004                     5,5
         3 002                     2,5
         7 003                    2,99
         8 005                     4,9


--know we have upadate and new records at the same times.