DB2/400 en V3R10 (via PTF SF22302) Il faut rappeller une nouveauté de DB2 non documentée car implémentée via une PTF de l'OS. la jonction (norme 92) peut être définie avec la clause JOIN : + produit cartésien: SELECT ... FROM table1 CROSS JOIN table2 (équivalent au précédent sans clause WHERE) + jointure conditionnelle SELECT ... FROM table1 JOIN table2 ON zone1 = zone2 (toute expression logique est acceptée après ON) les jointures sont par défaut internes (elles n'affichent que les enregistrements en correspondance) On parle de INNER JOIN (qui est indentique à JOIN seul) |
+ jointure externe (LEFT OUTER JOIN) pour SQL/400 LEFT JOIN est identique à LEFT OUTER JOIN les colonnes de table2 sont initialisées à NULL. exemples : liste des clients, avec, pour ceux d'entre eux ayant passé des commandes, la liste des commandes. SELECT codcli, nomcli, numcde, datcde, datliv FROM clients c LEFT OUTER JOIN command d ON c.numcli = d.numcli WHERE ... + traitement des enregistrements sans correspondance SELECT ... FROM table1 EXCEPTION JOIN table2 ON zone1 = zone2 ne fournit que les enregistrements de table1 n'ayant pas d'équivalence dans table2 . |
DB2/400 en V3R60 Il est possible d'ajouter (ADD), retirer (DROP) ou de modifier (ALTER) une colonne, modifiant ainsi la structure même de la table : ADD ALTER TABLE nom-table-----< ALTER >-COLUMN ---------------> DROP ADD COLUMN = même syntaxe que CREATE TABLE ADD COLUMNS-nom-FOR COLUMN-nom/400---Définition-------> >----------------------------------------------------> !--NOT NULL-------------! !--clause WITH DEFAULT--! >-------------------------------------------------- ! ! !--CONSTRAINT--nom---UNIQUE----------------! !-PRIMARY KEY-----! !-REFERENCES ...--! |
!--CASCADE---! DROP COLUMN-----nom de zone----- !------ !--RESTRICT--! CASCADE indique que tous les logiques, toutes les vues toutes les contraintes qui s'appuient sur cette colonne sont supprimées. RESTRICT indique que la colonne n'est pas retirée si un des éléments ci-dessus s'appuie sur cette colonne. ALTER COLUMN -------------------------------------------------> !-SET ---DATA TYPE- type de zone---! ! ! !--NOT NULL---------------! >----DROP ---DEFAULT-----------------------------> ! ! !-NOT NULL--! >----(clause WITH DEFAUT)------------------. |
la clause WITH DEFAULT et les valeurs par defaut ont été modifiées WITH DEFAULT-------------------------------------------------------. !--'constante'----! !---NULL----------! !--CURRENT_DATE---! !--CURRENT_TIME---! !CURRENT_TIMESTAMP! CURRENT_DATE, CURRENT_TIME et CURRENT_TIMESTAMP représente l'horloge au moment de l'insertion (écriture) les valeurs par défaut si vous n'indiquez rien sont : blanc pour l'alpha 0 pour le numérique CURRENT_DATE pour une variable date CURRENT_TIME pour une variable heure CURRENT_TIMESTAMP pour une variable horodatage |
Pour les programmes réalisant leurs E/S par SQL, cette seule action suffit puisqu'il n'y a pas de buffer : un programme contenant des ordres SQL demande des colonnes (et non un enregistrement), que le système place dans des VARIABLES ! Cela n'empêchera pas les recompilations des programmes d'autres langages et SQL/400 sera compatible avec la norme certains produits micros (comme Visual Basic) utilisent le ALTER TABLE Cela apporte aussi une nouvelle commande OS : CHGPF qui comporte un paramètre SRCFILE qui permet une Recréation ATTENTION : la recopie se fait sur les noms de zone, vous ne pouvez donc pas renommer des zones, mais les modifier, en ajouter et modifier des paramètres comme EDTCDE, COLHDG, .... |
Les mots-clés SDD suivants n'affectent pas le "LEVEL CHECK" + TEXT + COLHDG + CHECK + EDTCDE + EDTWRD + REF + REFFLD + COMP, RANGE, VALUES + TRNTBL + REFSHIFT + DFT + CCSID + ALWNULL ET, en règle générale, tout ce qui touche à : - la jonction - la définition du chemin d'accès - les sélections / omissions. |
Le système crée un fichier Q_AT00000 qui est en fait la nouvelle structure puis: + il envoie un message s'il y a risque de perte de données [moins de zones ou zone(s) plus petite(s).] + il copie tous les enregistrements avec FMTOPT(*MAP *DROP) + il reporte toutes les relations bases de données - fichiers logiques - intégrités - triggers sur le nouveau fichier, et il supprime l'original. IL EST BIEN SUR CONSEILLE DE FAIRE UNE SAUVEGARDE AVANT ! En début de V3R60,les conversions numérique vers date posent des problèmes mais cela fonctionne à partir de la cumulative C6_338_360. |
Sinon, nous sommes limités aux possibilités de la commande CPYF. tout format numérique <--> tout format numérique (attention avec 0 décimales pour le binaire) numérique étendu --> caractère les dates avec année sur 2, sont comprises entre 1940 et 2039, elles sont considérée par defaut au format du job, elles contiennent le séparateur dans le cas du caractère. <--> date au format *YMD, *DMY , *MDY numérique étendu --> date au format *ISO, *USA, *EUR caractère <--> date *YMD, *DMY, ... (idem) --> date *EUR, *USA, ... caractère <--> timestamp (idem pour les formats) date <--> date (changement de format transparent) heure <--> heure |
Autres paramètres de CHGPF : Comme avec SQL, deux paramètres indiquent ce qu'il faut faire en cas de suppression de zone dans le fichier : DLTDEPLF(*YES/*NO) : suppression des logiques qui s'appuient sur cette zone RMVCST(*REMOVE/*RECTRICT) : retrait des contraintes utilisant cette zone. les paramètres : SRTSEQ, LANGID et CCSID peuvent être modifiés (avec CCSID, SRCFILE doit être renseigné) Le paramètre ACCPTHSIZ est nouveau, il permet d'indiquer la taille maxi de l'index: - *MAX4GB = 4 Go, fichier compatible avec versions précédentes - *MAX1TB = 1 Téra octets !!! Le paramètre UNIT est ignoré en V3R60 (utilisez plutôt les ASP) |
SQL : nouvelles fonctions , nouveaux registres CHARACTER_LENGTH = nbr de caractères (zone à lg variable) COALESCE et IFNULL = alias de VALUE(v1, v2), renvoie le premier non null CONCAT( ) = ancienne syntaxe : nom CONCAT prenom maintenant en plus : CONCAT(nom, prenom). CURDATE() = idem au registre CURRENT DATE CURTIME() = " " CURRENT TIME NOW() = " " CURRENT TIMESTAMP DAYOFMONTH(date) = jour dans le mois (idem DAY().) DAYOFWEEK(date) = jour dans la semaine (1=dimanche) DAYOFYEAR(date) = jour (julien) dans l'année. QUARTER(date) = N° du trimestre WEEK(date) = N° de la semaine |
POWER(nombre, exposant) élévation à la puissance SUBSTR nouvelle écriture : SUBSTRING(zone FROM début ------------------------) !--FOR longueur--! si longueur n'est pas indiqué, SQL traite jusqu'à fin de zone. LEFT(zone, lg) Extrait les n caractères de gauche. LTRIM( ), RTRIM( ) et TRIM( ) Supprime les espaces à gauche, à droite ou aux deux extrémités. UCASE( ) ou UPPER transformation minuscules/MAJUSCULES |
TRANSLATE(chaîne-----------------------------------------------------> ! ! !---, origine---------------------------------! ! ! !--, remplacement--! >-------------------------------) ! ! !--PADDED WITH-' '--! Exemple: TRANSLATE(var1 , '0,F' , ' .$') [' ' devient 0 ] ['.' devient ','] [ $ devient F ] VARCHAR(expression, Lg----------------) ! ! !--CCSID---! Transforme une expression en lg variable avec gestion du CCSID. VARGRAPHIC( ) : idem en DBCS. |
Nouveaux types de verrouillage sous contrôle de validation. val! équivalent ! enregistrements verrouillés ----!---------------------------------------------------------- *NC ! *NONE ! aucun, commit/rollback inactif. ! ! *UR ! *CHG ! tous les enregistrements modifiés ! ! *CS ! ! idem *CHG, plus un enregistrement par ! ! fichier en lecture seule ! ! *RS ! *ALL ! tous les enregistrements (même en lecture) ! ! *RR ! (nouveau) ! idem à *ALL, plus ALCOBJ du fichier Cela peut s'indiquer maintenant sur le SELECT par la clause : SELECT .... FROM ... WHERE .... WITH [RR!RS!CS!UR!NC] . ainsi que sur les instructions :INSERT, UPDATE, DELETE. |
Divers OS/400 : + nouvelles options pour la commande CPYF MBROPT(*UPDADD) : si vous copiez des fichiers avec index(s), tout enregistrement qui provoquerait une clé en double remplace la clé existente, sinon il y a ajout d'enregistrement (comme avec *ADD). Le message de fin de copie indique le nombre d'enregistrements ajoutés et le nombre d'enregistrements mis à jour. PRINT(*ERROR) : les enregistrements en erreur sont imprimés (à concurrence du nombre indiqué dans ERRLVL) |
+ arrivée du parallélisme avec CHGQRYA DEGREE(*IO) l'optimiseur de requête peut mettre en oeuvre : parallel pre-fetch : lecture des enregistrements en // (multi-canaux) parallel table/index pre-load : chargement complet en mémoire de la table ou de l'index (toujours en //) + une nouvelle fonction pour analyser votre activité Base de données. STRDBMON = démarre le moniteur de base de données, pour un job ou pour tous les jobs de la machine. on indique le nom du fichier de sortie. ENDDBMON = arrêt du moniteur et écriture de l'analyse dans le fichier |
Chaque requête est analysée en détail avec : - liste des fichiers traités - options utilisées (jonction, groupage, ....) - liste des indexs examinés (raison du choix ou du refus) - nombre d'enregistrements traités - consommation CPU, ... (Voir le fichier modèle QAQQDBMN ) Champs Lg T texte ------ ----- --------------------- QQRID 015,0 P Record ID QQTIME 026 Z Heure de création QQJFLD 046 H zone de jonction QQRDBN 018 A nom DRDA QQSYS 008 A Système QQJOB 010 A Job .... |
Les enregistrements sont identifiés par un code (QQRID) QQQ1000 informations SQL QQQ3000 séquence d'arrivée " 3001 utilisation d'un index existant " 3002 création d'index " 3003 tri " 3004 utilisation d'un fichier temporaire " 3005 fichier verrouillé " 3006 Chemin d'accès reconstruit " 3007 timeout de l'optimiseur " 3008 sous-requête (SELECT dans un WHERE) " 3010 utilisation d'une variable HOST " 3014 informations générales " 3018 STDBMON/ENDDBMON " 3019 détail Pour plus de détail voir SC41-3701-01 "DB2 for OS/400 Database Programming" [Appendix D] |