Bonjour,
A Peut-êtreUneRéponse : tu précises que la plupart des sites sur lesquels tu as travaillé interdisent les ttg. Je pense franchement que c'est par méconnaissance de leur utilisation. Ca marche super bien, c'est extrêmement rapide, nous n'avons jamais eu de problème quelconque. Nous nous servons de plusieurs centaines de ttg dans des centaines de programmes (batch comme tp) et ça marche nickel. Et le SI sur lequel je bosse, il y a des dizaines de tables de plusieurs millions voire dizaines de millions de lignes (maxi dans les 300 millions) que nous prenons en jointure avec des ttg sans souci. Franchement, pour cibler les lignes à lire, les ttgs, c'est top. Tu peux également t'en servir pour faire des tris en interne d'un programme : tu reçois des lignes d'une TS par exemple que tu souhaites restituer à l'utilisateur dans un ordre précis. Tu charges les lignes dans une ttg et tu relis order by ton critère : simple et rapide.
Pour Sly3333 et toute personne intéressée, ci-dessous un copier/coller de mon support de cours. Quant à la différence entre global temporary table ou declared, il n'y en a pas concernant leur utilisation. Une "global" est créée une bonne fois pour toute, une "declared" juste le temps du programme. Dans ma boite, le DDL est interdit à tout développeur, donc on ne se sert que de ttg. Mais c'est juste une norme, pas une obligation.
Ces tables (ttg dans la suite du document) sont utilisées pour stocker des données temporaires.
Il peut exister plusieurs instances d’une même ttg mais le contenu sera unique pour chaque thread. Les données insérées dans une ttg par un programme A ne seront jamais visibles par un programme B tournant en parallèle et accédant à la même ttg (et inversement).
De même, aucune contention ne peut exister sur une ttg.
Toutes les lignes d’une table temporaire sont supprimées
- après un COMMIT,
- après un ROLLBACK,
- à la fin du thread.
Par rapport à cette remarque, une exception : pour pouvoir se servir d'une ttg dans un curseur et faire des commits intermédiaires sans perdre les lignes de la ttg, il faut déclarer le curseur WITH HOLD.
Les tables temporaires globales peuvent servir pour :
- Servir de tables de travail pour ne cibler que des lignes précises à lire (ca le plus courant).
- Charger des tables de codification Armide ou Spitab dans une table DB2 pour profiter de la facilité du langage SQL et être sur d’avoir des données à jour.
- Réaliser des tris avant affichage de données à l’utilisateur en TP.
- Autres (fonction des besoins des différents développeurs)…
Exemple d’utilisation
Début programme
Tant que non fin
Lecture VSAM
INSERT table temporaire
Fin tant que
DECLARE cursor for SELECT table temporaire en jointure avec des autres tables
Tant que sqlcode = 0
FETCH cursor
.......................
Fin tant que
Fin programme -> Le contenu de la table est détruite sans intervention du programmeur
Limites : une table temporaire ne peut pas :
- avoir de contraintes référentielles ou sur colonnes,
- avoir d’index,
- avoir de valeurs par défaut autres que NULL,
- avoir de clé unique, primaire ou étrangère,
- être parent,
- être référencée dans des utilitaires,
- faire l’objet d’un ordre LOCK TABLE,
- faire l’objet d’un DELETE sélectif,
- être mise à jour par UPDATE,
- seuls les ordres INSERT, SELECT, DELETE de masse et DECLARE, OPEN, FETCH, CLOSE cursor sont acceptés.
Warning : en théorie, il est inutile de supprimer les lignes d'une ttg après utilisation, c'est fait au premier commit, cad à la fin du programme. Gaffe, dans le cas d'utilisation de ttgs dans un enchainement d'appel de sous-programmes, le RETURN ne générant pas de commit, les lignes d'une ttg insérées dans un ss-pro sont toujours présentes lorsqu'on retourne au programme appelant. Si on appelle ensuite un autre ss-pro qui se sert de la même ttg, cela peut poser problème... Nous avons donc pris l'habitude (norme obligatoire) de toujours faire un DELETE FROM TTG juste avant le RETURN, en environnement TP. Cela ne coûte rien et sert d'assurance...
Partager