Nouveautés DB2/400 en V3R60

BoTTom |    Changer de couleur
                         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)


|    Changer de couleur
 
            + 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 .
 
 


|    Changer de couleur
                         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 ...--!


|    Changer de couleur
 
                                 !--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)------------------.
 


|    Changer de couleur
 
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
 


|    Changer de couleur
 
 
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, ....
 


|    Changer de couleur
 
 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.


|    Changer de couleur
 
 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.
 


|    Changer de couleur
 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


|    Changer de couleur
 
 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)


|    Changer de couleur
 
   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
 


|    Changer de couleur
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


|    Changer de couleur
 
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.


|    Changer de couleur
 
 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.


|    Changer de couleur
 
 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)
 
 


|    Changer de couleur
 
 + 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
 
 


|    Changer de couleur
 
   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
 
           ....
 


|    Changer de couleur
 
          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]





©AF400