Le Merge sous SQL DB2

Je viens de publier sur le site XDocs400.com un nouvel article que j’ai intitulé « Le MERGE sous SQL DB2« .

Cela faisait un moment que je voulais écrire un article concernant cette instruction SQL, apparue sur la V7R1 de DB2 for i, mais comme j’étais sur plusieurs dossiers « chauds », je ne trouvais tout simplement pas le temps de le faire. Enfin, je n’ai pas beaucoup de mérite à publier cet article maintenant, vu que ce n’est finalement qu’un extrait du cours « DB2 SQL avancé » sur lequel je planchais en fin d’année dernière.

Je tenais beaucoup à publier cet article, car le MERGE SQL est certainement une des instructions les plus intéressantes pour les développeurs d’applications de gestion, qui ont souvent à écrire des choses du genre : « si cette donnée existe dans la base alors je la mets à jour, sinon je l’ajoute ». Le MERGE SQL permet de faire cela très simplement, et bien plus encore, comme vous le pourrez le constater en lisant ce nouveau dossier. Et c’est tellement pratique à utiliser, que je m’en sers maintenant dans tous mes développements, que ce soit en PHP, en RPG ou en PL/SQL (procédures stockées DB2). Il est vrai que j’ai la chance de travailler en ce moment pour des clients dont les serveurs sont en V7R1, ce qui n’est pas le cas de tous mes confrères, malheureusement.

Le seul inconvénient que je verrais dans l’utilisation du MERGE, c’est l’impossibilité de récupérer un « result set » des données impactées par l’instruction. En effet, vous savez peut être (ou peut être pas) que vous pouvez obtenir un « result set » des données modifiées par un DELETE, un INSERT ou un UPDATE, en utilisant la syntaxe SQL DB2 suivante : SELECT * FROM FINAL TABLE (INSERT …).

Cette technique utilisant la clause « FINAL TABLE » peut être très utile pour récupérer la liste des identifiants créés par un INSERT SQL, ou tout simplement le dernier identifiant généré par une série d’INSERT, vous pouvez dans ce cas écrire quelque chose dans ce genre : SELECT MAX(ID) FROM FINAL TABLE (INSERT …).

Le MERGE SQL ne peut pas être combiné avec la clause « FINAL TABLE », donc vous ne pourrez pas récupérer le result set résultant d’un MERGE. C’est à mon avis un inconvénient mineur au vu des possibilités qu’apporte le MERGE.

J’ai d’autres sujets tout aussi intéressants en préparation sur ma « boilerplate » (comme disent les anglais), que je publierai prochainement sur XDocs400.com, comme par exemple :

  • comment contrôler que toutes les jobd pointent bien sur des bibliothèques existantes
  • comment récupérer l’intégralité des postes du scheduler IBMi dans une table (réactualisation en RPG Free d’un vieil article publié sur XDocs400.com)

Ca c’est pour les sujets chauds à paraître dans les semaines à venir. J’en ai aussi d’autres en préparation, mais qui ont besoin de mûrir encore un peu, alors je ne m’étendrai pas davantage, je vous en reparlerai au fil de l’eau.

Sur ce blog, vous trouverez aussi prochainement quelques articles consacrés au langage Javascript (dans le contexte du HTML5), et à différentes techniques assez géniales que j’ai découvertes au cours de mes recherches sur ce langage (notamment sur les polyfills, sortes de librairies destinés à pallier les carences des vieux navigateurs).

Restez à l’écoute.

A très bientôt

Grégory