décembre
2012
Par : Zakaria EL HAMDAOUI
Consultant Oracle
A travers ce petit article, je vais essayer de présenter l’instruction « MERGE », qui malheureusement n’est pas assez utilisée par les développeurs.
- - Evite des mises à jour distinctes
- - Améliore les performances et facilite l’utilisation
- - S’avère particulièrement utile dans les applications de data warehouse
SQL a été étendu pour inclure l’instruction MERGE. Cette instruction vous permet de mettre à jour ou d’insérer une ligne dans une table de façon conditionnelle, évitant ainsi l’utilisation de plusieurs instructions UPDATE. La mise à jour ou l’insertion dans la table cible dépend d’une condition définie dans la clause ON.
Etant donné que l’instruction MERGE combine les commandes INSERT et UPDATE, vous devez disposer des privilèges INSERT et UPDATE sur la table cible et du privilège SELECT sur la table source.
L’instruction MERGE est déterministe. Vous ne pouvez pas mettre à jour plusieurs fois la même ligne de la table cible dans la même instruction MERGE.
Vous pouvez également utiliser des boucles PL/SQL et plusieurs instructions LMD. Cependant, l’instruction MERGE est plus facile à utiliser et s’exprime plus simplement sous la forme d’une instruction SQL.
L’instruction MERGE convient à plusieurs applications de data warehouse. Par exemple, ce type d’application peut nécessiter l’utilisation de données provenant de plusieurs sources, et certaines de ces données peuvent être en double. A l’aide de l’instruction MERGE, vous pouvez ajouter ou modifier des lignes sous certaines conditions.
Syntaxe de l’instruction MERGE
USING (table|view|sub_query) alias
ON (join condition)
WHEN MATCHED THEN
UPDATE SET
col1 = col_val1,
col2 = col2_val
WHEN NOT MATCHED THEN
INSERT (column_list)
VALUES (column_values);
Exemple de fusion de lignes
USING employees e
ON (c.employee_id = e.employee_id)
WHEN MATCHED THEN
UPDATE SET
c.first_name = e.first_name,
c.last_name = e.last_name,
c.email = e.email,
c.phone_number = e.phone_number,
c.hire_date = e.hire_date,
c.job_id = e.job_id,
c.salary = e.salary,
c.commission_pct = e.commission_pct,
c.manager_id = e.manager_id,
c.department_id = e.department_id
WHEN NOT MATCHED THEN
INSERT VALUES(e.employee_id, e.first_name, e.last_name,
e.email, e.phone_number, e.hire_date, e.job_id,
e.salary, e.commission_pct, e.manager_id,
e.department_id);
L’exemple ci-dessus compare les valeurs EMPLOYEE_ID de la table COPY_EMP avec les valeurs EMPLOYEE_ID de la table EMPLOYEES. Lorsqu’une correspondance est trouvée, la ligne de la table COPY_EMP est mise à jour pour qu’elle corresponde à la ligne de la table EMPLOYEES. Si la ligne n’est pas trouvée, elle est insérée dans la table COPY_EMP.
La condition c.employee_id = e.employee_id est évaluée. La table COPY_EMP étant vide, la condition renvoie un message indiquant l’absence de correspondance. La logique correspond à la clause WHEN NOT MATCHED et la commande MERGE insère les lignes de la table EMPLOYEES dans la table COPY_EMP.
Lorsque la table COPY_EMP comprend des lignes et que les ID employés correspondent dans les deux tables (tables COPY_EMP et EMPLOYEES), les lignes présentes dans la table COPY_EMP sont mises à jour pour qu’elles correspondent à celles de la table EMPLOYEES.
Catégories
L | Ma | Me | J | V | S | D |
---|---|---|---|---|---|---|
« oct | ||||||
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |