Architecture IBM i


Présentation de DB2 for IBM i


La base de données AS/400 est globale (il n'y a pas de possibilité de créer plusieurs bases indépendantes,
sauf pool de disques indépendants en V5R20).Ce qui s'en rapproche le plus est la notion de bibliothèque.

Chaque bibliothèque contient des fichiers base de données autonomes (objets au sens OS/400 du mot) :

fichiers physiques

                             ######################## 
                             ##  FICHIER PHYSIQUE  ## 
                             ######################## 




     C'EST LE RESERVOIR DE DONNEES 
           - DESCRIPTION  -----> Caractéristiques du Fichier                                   Format ou Longueur d'Enregistrement 
           - CHEMIN D'ACCES  ----!                                   !----> Autant que de Membres             - DONNEES         ----! 


C'est véritablement l'équivalent d'une TABLE SQL (plus la notion de membre)





                             ######################## 
                             ##  FICHIER PHYSIQUE  ## 
                             ######################## 


     SPECIFICATIONS DE DESCRIPTIONS DE DONNEES 
        Permettent de:                  - donner le nom du format (qui sera désormais connu en tant                    que tel par le système)                  - décrire le dessin d'enregistrement (en citant dans l'ordre                    les zones composant le format)                  - solliciter certaines fonctions par l'intermédiaire de mots                   clés et de paramètres            NB: il n'y a qu'un seul format par FICHIER PHYSIQUE 
        chaque ligne est découpée comme suit :
                1 1        223   33333      4      6          7 9        890   45678      5      A..........T.NOM+++++++RLG+++TD+U......FONCTION+++++++++++++++++++++++

                             ######################## 
                             ##  FICHIER PHYSIQUE  ## 
                             ######################## 


     SPECIFICATIONS DE DESCRIPTIONS DE DONNEES 
        Un source SDD est décomposé en QUATRE niveaux :
        +
 Niveau fichier (avant le premier format)                                                                                                définit les mots-clés valables pour l'ensemble du fichier
col 45 :
                  
REF(fichier-répertoire)
UNIQUE

        + Niveau format (à partir du nom du format et jusqu'à la première                          définition de zone)                  col 17    : R (record)
                 col 19-28 : nom du format
                 col 45    : mots-clés

                             ######################## 
                             ##  FICHIER PHYSIQUE  ## 
                             ######################## 


     SPECIFICATIONS DE DESCRIPTIONS DE DONNEES 
        Un source SDD est décomposé en QUATRE niveaux :
        +
 Niveau zone (avant le format suivant ou avant le niveau C.A)                                                                                                col 17    : à blanc
                 col 19-28 : nom de la zone
              __ col 29    : référence           OU |              |__ col 30-34 : longueur
                 col 35    : type
                 col 36-37 : nb de décimales

                             ######################## 
                             ##  FICHIER PHYSIQUE  ## 
                             ######################## 


       NATURE ET LONGUEUR DE LA ZONE             1.  ZONE ALPHA ou CHAR     (nb de décimales à blanc)                type de zone  A ou BLANC  valeur par défaut 

-> codification EBCDIC
           2 . ZONE NUMERIQUE  (nb de décimales renseigné)                - par défaut les zones numériques sont en condensé (packé)                - la longueur fournie doit être la longueur totale(avec déc.)
              
 type de zone  P ou BLANC  packée (valeur par défaut)                               S           étendue (signée)                              B           binaire                               L           date                              T           horaire                              Z           horodatage:date,heure,microsecondes
  

                             ######################## 
                             ##  FICHIER PHYSIQUE  ## 
                             ######################## 
   MOTS-CLE COMPLEMENTAIRES. 

     1) DOCUMENTATION D'APPLICATION (colonne 45) 
          TEXT('TEXTE DE LA ZONE OU DU FORMAT')            COLHDG('ENTET1' 'ENTET2' 'ENTET3') 
     2) CONTROLES DE SAISIE         (colonne 45) 
          COMP(XX val)   xx = EQ(=),NE(<>),GT(>),GE(>=),...           RANGE(borneinf bornesup)           VALUES(val1 val2 val3 ...)           CHECK(xx)      XX = VN nom valide,M10 = modulo 10,..(contraignant)
   
  3) PRESENTATION DES DONNEES NUMERIQUES      
          EDTCDE(x)         un édit-code prédéfini           EDTWRD('zzzzzzzz') masque d'édition
   


     EDTCDE       ------ --------------------------------------------------------------------------- ! Impression ! Impression !!  Pas  ! Symbole!   Symbole    ! X Ajout du   ! !    des     !  montants  !!  de   !   CR   !      -       !   signe +    ! !   points ? !  nuls ?    !! signe !        ! à D  ! à G   ! Y Impression ! !--------------------------------------------------!-------!   d'une date ! !    OUI     !    OUI     !!   1   !    A   !   J  !   N   ! Z Suppression! !    OUI     !    NON     !!   2   !    B   !   K  !   O   !   des zeros  ! !    NON     !    OUI     !!   3   !    C   !   L  !   P   !   et enleve  ! !    NON     !    NON     !!   4   !    D   !   M  !   Q   !   le signe   ! ---------------------------------------------------------------------------
 4) DATES ET HEURE                          

 
          DATFMT, DATSEP, ...       DATFMT    !       DATSEP             !    exemple      ------    !       ------             !   -----------      *DMY      !       '/', '.', etc ..   !   15/02/98      *YMD      !        idem              !   98/02/15                !                          !      *ISO      !       imposé             !   1998-02-15      *EUR      !       par le format      !   15.02.1998                !                          !                      

 5) NOUVEAUTES V2R11                         

          ALWNULL Support de la valeur nulle
 

          VARLEN variable à lg variable

 


                             ######################## 
                             ##  FICHIER PHYSIQUE  ## 
                             ######################## 


     SPECIFICATIONS DE DESCRIPTIONS DE DONNEES 
        Dernier niveau (facultatif avec les PF) :
        +
 Niveau C.A (en fin de source, dernier niveau)                                                                                                col 17    : K = définition de clé
                 col 19-28 : nom de la zone
                 col 45    : définition complémentaire

DESCEND






Exemple :

                R CLIENTF1                  TEXT('FICHIER CLIENT')                   NOCLI          6  0       TEXT('N° CLIENT')                                             COLHDG('N°' 'du' 'Client')                                             EDTCDE(Z) COMP(GT 0)                   NOMCLI        30          TEXT('NOM CLIENT')                                             COLHDG('NOM Client')                                             COMP(NE ' ')                   DEP            2S 0       TEXT('DEPARTEMENT DU CLIENT')                                             COLHDG('DEPT')                                             RANGE(01 98)                   DATCRT           L        TEXT('Date création')                                             COLHDG('Date' 'Création')                                             DATFMT(*EUR)                   CACLI         13  2       TEXT('CA ANNUEL')                                             COLHDG('CA' 'Annuel')                                             EDTCDE(L) 
ALWNULL

Pour éditer votre membre source, utilisez RDI

 

 Il est conseillé d'utiliser la fonction Répertoire pour la définition de
  votre base de données.

 L'AS/400 propose de définir toutes les zones manipulées par votre   entreprise dans un fichier UNIQUE, auquel vous allez attribuer la fonction   de répertoire (catalogue).
 Il s'agit d'un fichier traditionnel pour l'AS/400 contenant toutes les  définitions de données et dans lequel vous ne placerez JAMAIS de données.
 Puis à la création de vos fichiers physiques vous nommerez les zones devant   composer le format d'enregistrement, sans les définir, en demandant au   système de copier la définition se trouvant dans le répertoire.
  (Faire REFERENCE)      A                                      REF(REPERTOIRE)       A          R FORMAT                    TEXT('------------------')      A            ZONE1     R       A            ZONE2     R       A            ZONE3     R       A            ZONE4     R       A            ZONE5     R 


 Cela permet d'avoir une définition unique des données de l'entreprise.
      définition physique.       contrôles de validité.       fonctions documentaires.       Présentation des données numériques.
 Toutes ces définitions seront répercutées dans le fichier physique et, plus   tard, utilisées par les utilitaires de développement:
                  -QUERY ou QM (liste de fichiers)                   -DFU         (maintenance de fichiers)                   -RLU         (conception d'états)                   -SDA         (conception d'images-écran)
 Plus grande cohérence, Plus grande productivité.
 Le répertoire peut être modifié à tout moment,le lien REPERTOIRE<->PF   n'existe que pendant la création du fichier.
 Toute modification du répertoire est IGNOREE par les fichiers physiques.

  VUE D'ENSEMBLE. 
                            ________                   ------------  DSPF 
               REPERTOIRE  <________>                  ! déf.     !
                           ! déf.   ! ---------------> !  formats !
                           ! unique ! ------------     ------------
                           !  zones !            !    /          /
                     !---- <________> ---!       !   ------------     PRTF 
                  ___v____          _____v___    !          ----------------
           PF1   <________>   PF2  <_________>   !--------> ! déf.    ----/
            <<<<<! déf.   !>>    <<! déf.    !>>>           ! formats/
          <<     !--------! >> <<  !---------! >>>>         !-------/
         <<      ! données! ><<    ! données ! >>  >>
        <<       <________> ><     <_________> >>    >>>>>>>>>>>>>>>
 LF11 __v_____          ____v____             __v_____          ___v_____
     <________>  LFJx  <_________>     LF21  <________>  LF22  <_________>
     ! déf.   !        ! déf jonc!           ! déf.   !        ! déf.    !
     !--------!        !---------!           !--------!        !---------!
     ! index  !        ! index   !           ! index  !        ! index   !
     <________>        <_________>           <________>        <_________>

Le lien entre répertoire et fichiers (physiques ou unités) est fugace (le temps de la création).Le lien entre PF et LF est bien entendu permanent.


Aujourd'hui , SQL est de plus en plus utilisé :

Exemple de script :


CREATE TABLE BIB/CLIENTS

(NOCLI DEC(6 , 0) PRIMARY KEY ,
NOMCLI CHAR(30) ,
DEP NUMERIC(2 , 0) CHECK BETWEEN 01 AND 98 ,
../ ...
DATCRT DATE,
CACLI DEC(13 , 2 )
)

Outils de conception de la base.


|

1/ en mode caractère (Terminal 5250)

 

les paramètres sont renseignés différemment [SIZE(*nomax) REUSEDLT(*yes) et MAXMBRS(1) ]

|
2/ tapez vos scripts dans un membre source

EN version 6, RUNSQLSTM admet un paramètre SRCSTMF indiquant les coordonnées d'un fichier dans l'IFS plutôt qu'un membre source.

|



 Quelques commandes utiles  : -------------------------

    - DSPFD     = description générale
    - DSPFFD    = liste des champs
    - DSPPFM    = voir le contenu (non formaté)
    - RGZPFM    = réorganisation physique des lignes d'une table
    - DSPDBR    = relations base de données (relations PF <-> LF)


    - CPYF     = copie d'un fichier Base de données
    - STRDFU    = utilitaire de maintenance de fichiers                   & UPDDTA = modifier le contenu                     DSPDTA = voir le contenu (formaté)
    - STRQRY   = utilitaire de génération de listes                   & RUNQRY = lister le contenu (écran ou état)
    - STRSQL   = SQL interactif (en mode caractères, donc)


|

    - CPYF copie de fichiers

           FROMFILE                      fichier d'origine                              *LIBL                TOFILE                        fichier de destination                              *LIBL                FROMMBR        *FIRST         membre d'origine            TOMBR          *FIRST           "    de destination
           MBROPT         *NONE          option : *NONE ==> création                                                   *ADD      Ajout                                                   *REPLACE  Remplacement            CRTFILE        *NO            création ?  divers:            FRMRCD/TORCD   sélection sur le rang (de a)
           INCREL         sélection sur une colonne
           FMTOPT         conversion *NONE fichiers identiques                                      *DROP des colonnes peuvent disparaitre                                      *MAP  copie zone à zone avec conversion                                     et initialisation des nouvelles colonnes

|

    - CPYTOIMPF/CPYFRMIMPF Exportation/Importation de fichiers
      TOSTMF/FRMSTMF : coordonnées du fichier IFS (fichier stream)                         dans lequel exporter(TOSTMF) à importer(FRMSTMF)
      RCDDLM         : caractère de fin de ligne
                       *EOR  fin d'enregistrement                        *CR   retour chariot , *LF   fin de ligne                        *CRLF les deux précédents
      DTAFMT         : les données sont-elles délimitées
                       *DLM : oui                               FLDDLM indique le délimiteur de zones    (;)                               STRDLM indique le délimiteur de chaînes  (")                        *FIXED : non
      RPLNULLVAL (CPYFRMIMPF) indique de remplacer la val. nulle par le dft.
      DECPNT,DATFMT,TIMFMT indiquent le format des décimales,dates et heures

QUERY/400, est un outils (orienté utilisateurs) d'extraction de données.

Vos requêtes sont mémorisées dans des objets *QRYDFN


voici, les différentes étapes de QUERY :

la première vous permet de choisir un fichier
:


Vous pourrez aussi choisir les champs à afficher sur l'état (la numérotation indique l'ordre sur la ligne d'impression)



et bien sûr, choisir les enregistrements


Vous pourrez aussi, faire des totaux (sommes, moyennes, comptage, ...)


indiquer des ruptures afin d'imprimer et de remettre à zéro, ces totaux.


et définir des options d'impression (mise en page, taille d'une page, etc...)

fichiers logiques



                          LES FICHIERS LOGIQUES

Un Fichier logique est un objet de type *FILE. Il possède une description et 1 ou plusieurs membres.
CES MEMBRES NE CONTIENNENT PAS DE DONNEES,
ils ne possèdent qu'un chemin d'accès qui pointe sur les données d'un ou plusieurs fichiers physiques.
 - historiquement : index sous forme d'arbre binaire [bi-tree].

- depuis la V4R20, il est possible de construire des index EVI






LES FICHIERS LOGIQUES VONT NOUS PERMETTRE :
                  - d'avoir une clé différente du fichier physique, donc                     d'accéder dans un nouvel ordre aux enregistrements
                  - de regrouper les données de plusieurs fichiers physiques
                  - de sélectionner une partie des enregistrements d'1 ou                     plusieurs fichiers physiques.


              Une Clé différente du fichier physique               --------------------------------------
              Prenons l'exemple du fichier physique CLIENTP1 ci-dessous.

     A************************      A*   FICHIER CLIENTP1      A************************      A                                      REF(REPERTP1)      A          R CLIENTF1                  TEXT('FORMAT DU FICHIER CLIENTP1')      A            NOCLI     R      A            NOM01     R      A            ADR01     R      A            ADR02     R      A            CODPS     R      A            CODEX     R      A            CRLIM     R      A            TOTAL     R      A          K NOCLI


MAINTENANT JE VEUX CREER UN CHEMIN D'ACCES SUR CES DONNEES DANS L'ORDRE DES NOM DE CLIENT (ZONE NOM01). J'APPELLERAI CE FICHIER LOGIQUE CLIENTL1. Voici sa description:

     A************************      A*   FICHIER CLIENTL1      A************************      A          R CLIENTF1                  PFILE(CLIENTP1)      A          K NOM01                       ^                                               !                                               !                                       -----------------------                                       FONCTION NIVEAU FORMAT                                       INDIQUANT LE NOM DU                                       FICHIER PHYSIQUE SUR                                       LEQUEL POINTE LE FICHIER                                       LOGIQUE.

CE FICHIER N'A PAS DE DESSIN D'ENREGISTREMENT, MAIS          A LE MEME NOM DE FORMAT QUE LE FICHIER PHYSIQUE          =====> IL A LA MEME DESCRIPTION DE ZONES QUE LE FICHIER PHYSIQUE

REGARDONS MAINTENANT LE MEME EXEMPLE MAIS CETTE FOIS-CI AVEC
UN DESSIN D'ENREGISTREMENT DIFFERENT DU FICHIER PHYSIQUE.



     A************************      A*   FICHIER CLIENTL2      A************************      A          R CLIENTF2                  PFILE(CLIENTP1)      A            NOM01      A            NOCLI      A            ADR01      A            ADR02      A            CODPS      A          K NOM01


CETTE FOIS-CI IL Y A UN NOM DE FORMAT DIFFERENT ====> JE DOIS INDIQUER   LES ZONES FAISANT PARTIE DE CE FORMAT. (CE QUI PERMET, PAR EXEMPLE,    DE NE "VOIR" QUE LES ZONES AUTORISEES A CERTAINS UTILISATEURS)




 IL EST POSSIBLE DE FAIRE DES SELECTIONS D'ENREGISTREMENTS PAR LE BIAIS   DES FICHIERS LOGIQUES.
 Cette sélection se fait au niveau chemin d'accès, après la définition des   clés .
 Elle peut se faire en indiquant les enregistrements à sélectionner                                                        (S en col. 17)                     en indiquant les enregistrements à ommettre                                                        (O en col. 17)
 Puis en indiquant le nom de la zone sur laquelle porte le test   et le test à effectuer (en col. 45), en utilisant COMP, RANGE, VALUES.
      * si département = 75      A          S DEPT                      COMP(EQ 75)       * si département compris entre 11 et 33      A          S DEPT                      RANGE(11 33)       * si département = 44 ou 49 ou 85 ou 35.      A          S DEPT                      VALUES(44 49 85 35)



                      FICHIERS LOGIQUES JOINTS                       ------------------------
1 JONCTION. -----------
         Fonction permettant d'obtenir par UNE SEULE OPERATION          un ensemble d'informations venant de FICHIERS PHYSIQUES          DIFFERENTS.


         Fichiers Référencés :
         - Physiques seulement : 32 maxi
         - 1 fichier primaire (guide)
         - 1 à 31 fichiers secondaires

- fichiers en lecture uniquement



 Exemple : Soit les fichiers physiques suivants :
 
STGP1 (fichier stagiaires) | NOTP1 (fichier des notes)

R STGF1 | R NOTF1
NUMSTG 6S 0 TEXT('No stag') | NUMSTG 6S 0 TEXT('N° stag')
NOMSTG 20 TEXT('Nom') | LANG 3 TEXT('langage')
VILSTG 20 TEXT('Ville') | NOTE 4P 2 ..
DEPSTG 2P 0 TEXT('départ') |
Source :
       * JDFTVAL permet une jointure "externe"
A JDFTVAL
A R JOINTF JFILE(STGP1 NOTP1)
A J JOIN(1 2)
A JFLD(NUMSTG NUMSTG)
A JDUPSEQ(LANG)
A NUMSTG JREF(1)
A NOMSTG
A LANG
A NOTE
A K NUMSTG

 

Evolutions DB2 for i, de la V3 à la V7

 

Rappel sur des fonctions de DB2 for i récentes et donc, parfois, sous-employées :

Variables de Type DATE, HEURE, HORODATAGE



Notion de variable obligatoire/facultative (valeur )

Remarques : le support de la valeur nulle est disponible pour ILE/RPG-IV Version 3.70.



Les vues

(elles sont dans de nombreux cas plus puissantes que les fichiers logiques SDD):
On admet des vues portant sur des vues, des calculs, des sélections complexes, la clause GROUP BY

 

contraintes

contrainte d'entité :

 

 

intégrité référentielle

 

une clé étrangère doit se rapporter à une clé primaire d'une table déclarée parente.

(On ne peut pas insérer une commande se rapportant à un client non enregistré dans le fichier client)

 

il est alors possible de préciser comment gérer l'intégrité dans le sens parent/enfant. 
C'est à dire que faire si l'on tente de supprimer un client ayant des commandes.


l'utilisation du commit est fortement conseillée, et dans certains cas, obligatoire.( particulièrement la suppression en cascade)

|

 Définition d'une contrainte d'unicité
              ADDPFCST    FILE(client)                           TYPE(*UNQCST)                           CST(client_unique) <- nom de la contrainte                           KEY(nocli)
 Définition d'une clé primaire
              ADDPFCST    FILE(client)                           TYPE(*PRIKEY)                           CST(num_client)  <- nom de la contrainte                           KEY(nocli)
  Une clé primaire est une forme particulière de contrainte d'unicité.       (valeur nulle non autorisée)
  Il peut y avoir plusieurs contraintes d'unicité (portant sur des zones    différentes), il ne peut y avoir qu'une seule clé primaire.


|

 Intégrité référentielle
              ADDPFCST    FILE(command)                           TYPE(*REFCST)                           CST(clicommand)                           KEY(numcli)      <- zone du fichier commande                           PRNFILE(client)  <- fichier parent                           PRNKEY(nocli)    <- clé primaire/fichier client                           UPDRULE(*NOACTION)                           DLTRULE(*CASCADE)
UPDRULE :  *NOACTION  contrôle lors du COMMIT (journalisation obligatoire)                                 et après l'appel du trigger            *RESTRICT  contrôle immédiat       (journalisation facultative) 
DLTRULE : les mêmes +  *CASCADE  , *SETNULL , *SETDFT

 Les attributs des clés (primaire et étrangère) doivent être identiques :            même définition (type, lg, nombre de décimales)

|

 Si l'une des deux règles (UPDRULE ou DLTRULE) est différente de *RESTRICT :

  - vos fichiers DOIVENT être journalisés.
    s'ils ne le sont pas : - l'intégrité sera établie (ADDPFCST fonctionne).
                           - MAIS toutes vos demandes d'ouverture de fichier                               seront refusées (erreur d' E/S).
============================================================================

 Il y a 4 états possibles:  - Etablie/active       <-- OK, contrôle en cours
                            - Etablie/desactivée   <-- suspendue
                            - Définie/activée      <-- (pas de fichier ou de membre)
                            - Définie/désactivée   <-- idem, suspendue

|

 Une contrainte peut être momentanément "suspendue"

  Et donc, une contrainte établie peut s'avérer fausse


  Si une contrainte est fausse

     - soit suite à une restauration
     - soit suite à une désactivation , puis modifs dans le fichier
  Elle est notée "Check Pending" (verif en instance)


 Il faut utiliser la commande WRKPFCST


|

   WRKPFCST
 ##########################################################################   #           Gestion des contraintes de fichier physique                  #   #                                                                        #   # 2=Modifier   4=Enlever  6=Afficher enreg en instance de vérif.         #   #                                                                        #   # Opt  Contrainte   Fichier   Biblio    Type    Etat    verif/instance   #   #      ARTICK1      ARTICP1   MABIB     *PRIKEY                          #   #      ARTICC1      ARTICP1   MABIB     *REFCST ETA/DES    Oui           #   #      ARTICC2      ARTICP1   MABIB     *REFCST ETA/ACT    Non           #   #       ....                                                             #   # ==>                                                                    #   #                                                                        #   ########################################################################## 
 2=CHGPFCST, 4=RMVPFCST, 6=DSPCPCST
 "Verif : Oui" signifie que le système à détecté au moins un incohérence   (visualisable par l'option 6)

contraintes de domaine depuis la V4R20 |
V4R20 :

  - Check Contraints ou contraintes de domaine :
      il s'agit d'établir un contrôle sur une zone (doit être > à , <> de ..        devant être TOUJOURS vérifié.
      les contrôles demandés aujourd'hui (CHECK, RANGE, VALUES) ne sont        vérifiés que dans un monde transactionnel (gestionnaire écran)

      les nouvelles contraintes seront vérifiés dans toutes les conditions

      en cas d'erreur ==> message CPF502F

    ............................................................     : ADDPFCST FILE(CDEENTP1) TYPE(*CHKCST) CST(DATES_CST)     :     :          CHKCST(DATLIV > DATCDE)                         :     :..........................................................:

|

 et les contraintes peuvent être gérées par WRKPFCST :
............................................................................ :                                                                          : :                 Gestion des contraintes de fichier physique              : :                                                                          : :Indiquez vos options, puis appuyez sur ENTREE.                            : :  2=Modifier   4=Enlever   6=Afficher enreg en instance de vérif          : :                                                                          : :                                                              Vérification: :                                                                    en    : :Opt  Contrainte     Fichier     Biblio      Type      Etat       instance : :     QSYS_CDEEN  >  CDEENTP1    FORMATION0  *CHKCST   ETB/DES      OUI    : :                                                                          : :..........................................................................:

   ici le fichier est "établie/désactivée" puisqu'il y a des enregistrements      ne correspondant pas à la demande [datliv > datcde]


|

  l'Option 6 affiche le(les) enregistrement(s) en erreur :
  ..........................................................................   :                               Affichage du rapport                     :   :  Largeur . .:        71                                                :   :  Colonne . .:         1                                                :   :  Contrôle . . . .                                                      :   :  Ligne  ....+....1....+....2....+....3....+....4....+....5....+....6   :   :                N°       N°                                             :   :                CDE    CLIENT  DATE CDE    DATE LIV                     :   :           --------  --------  ----------  ----------                   :   :  000001         3         1   01.01.1940  01.01.1940                   :   :  ******  * * *  F I N  D E S  D O N N E E S  * * *                     :   :                                                                        :   :........................................................................:

   Après avoir modifié l'enregistrement il faut désactiver, puis réactiver     la contrainte, qui devient alors "établie / active".


 

vérification de type comp, range, values avec des constantes ou avec d'autres colonnes du même fichier.

 

quelques exemples

 

 

En version 7.2, Nouvelle clause VIOLATION sur les Check constraint :

ON INSERT VIOLATION SET column-name = DEFAULT
 L'erreur n'est pas signalée, la valeur par défaut est insérée

ON UPDATE VIOLATION PRESERVE column-name
 L'erreur n'est pas signalée, la valeur précédente est conservée

Triggers



Triggers

 

Associé à une action base de donnée

(on associe un pgm "maison" à l'action «insérer un client» ou «modifier un client» ou «supprimer un client».)

 

Remarques :

depuis la V3R70 un trigger peut modifier l'enregistrement base de données qu'il a recu en tant que paramètre.

   

Les triggers peuvent être écrit dans n'importe quel langage
C, RPG III ou IV ,COBOL, depuis la V5R10 enPL/SQL

 

exemple :

ou bien CREATE TRIGGER ...c'est le dernier paramètre qui autorise la mise à jour de l'enregistrement

 

jointure

 

DB2/400 admet maintenant la jonction norme SQL-92

 

C'est à dire SELECT * FROM CLIENT JOIN COMMANDE cde ON client.NOCLI = cde.NOCLI [WHERE ...]

 

Ce qui autorise les jointures externes :

(LEFT OUTER JOIN, c.a.d, tous les clients qu'ils possèdent ou non des commandes)

 

et les différences :

(EXCEPTION JOIN, c.a.d, les clients SANS commande))

V5R10, le RIGHT OUTER JOIN est admis


EN V5r30 la clause USING peut être utilisée : select * from vins join producteurs using(pr_code)

ainsi que les opérateurs EXCEPT et INTERSECT

V6R10 FULL OUTER JOIN

 

DRDA

 

Possibilité de travailler avec une base (DB2) éloignée, par CONNECT TO (le nom est paramétré dans WRKRDBDIRE)

 

Two PHASES COMMIT

 

il est possible d'inclure dans une même transaction des fichiers se trouvant sur des bases de données différentes (dans le cadre de DRDA)

 

Exemple :

    connect to base 1

        moins 100 dans la quantité pour le produit A1

    connect to base 2

        plus 100 dans la quantité pour le produit A1

    Commit

la phase de validation sera réalisée en deux temps :

•demande de préparation à la validation (prepared wave)
•validation effective (commited wave)

 

Dénomination en trois partie


Si l'on admet une connexion automatique (SSO ou un identifiant enregistré par ADDSVRAUTE) alors on peut utiliser

 

 

Procédures cataloguées

 

Un ensemble d'actions base de données devant être réalisées sur une base distante peut être demandé par l'appel à une procédure (un programme) stockée sur le serveur distant.

 

Cela normalise un ordre CALL (en tant qu'ordre SQL), avec passage de paramètres et ce, en étant affranchi de l'OS du serveur.

Sur l'AS/400 les procédures cataloguées peuvent être écrites dans n'importe quel langage et leur déclaration est optionnelle.

 

V4R20, on reconnait le PL/SQL pour l'écriture des procédures cataloguées.
V5R10 le compilateur C n'est plus obligatoire.

 

exemple :

Create Procedure bib/p1
    (in nomatin DEC(6, 0),
     in newcoef DEC(3, 0),
     out codert int)
language SQL
P1:
Begin

Declare coeflu DEC(3, 0);
Declare Exit handler for SQLExecption Set codert=SQLCODE;

Select coef from personp1 into coeflu where nomat = nomatin;

if newcoef > coeflu then
    update personp1 set coef = newcoef where nomat = nomatin;
end if;

End

 

Alter TABLE

 

L'ordre ALTER TABLE permet maintenant de modifier la structure d'une table, dynamiquement :

 

Pour les programmes réalisant leur entrés/sorties à l'aide de SQL, cette seule action suffit, pour les autres il faut recompiler.

Sous Sélections

Sous sélection admise dans l'ordre UPDATE

  la notion de sous-sélection permettait de mettre un ordre SELECT dans la clause WHERE d'un ordre SQL.

Cette synatxe est maintenant acceptée dans la clause SET de UPDATE 


 

- Les sous selections sous admises aussi dans l'ordres SELECT

 

• Historiquement dans la clause WHERE

• Depuis la V4R40 dans le from

• Depuis la V5R10 dans la liste des colonnes

      Select codart , qte * prix as montant, (select sum(qte * prix) from commandes where  
                                          famcod = c1.famcod) as totfam

          from commandes c1

tables dérivées 


  on peut indiquer un ordre SELECT dans la clause from d'un ordre SELECT
     ou bien déclarer juste avant le SELECT une "vue temporaire" par WITH.

 

exemple , soit un fichier des cours, chaque cours est enregistré sous un module de cours.

 je veux le nombre de cours du module qui en a le plus.

nouveaux types

 

Deux nouveaux types de données apparaissent en V4R40

   • les types de données LARGES (jusqu'à 15 Mo en V4, 2Go en V5)
   • les DATALINK (ou URL)

 

1/ les LOB (Large Object)

   ils sont de trois sortes
     + CLOB Character Large Object, supportent la notion de CCSID
     + DBCLOB Double Byte CLOB, idem CLOB mais en DBCS
     + BLOB Binary Large Object, binaires, donc prévus pour les images
                                                            la video, etc...
     ex: CREATE TABLE VOITURE (image as BLOB 2M)

 

2/ les types de colonne DATA LINK
  

il s'agit de colonnes dont le contenu référence un fichier externe.
     a/ le nom du fichier est donné sous forme d'URL
     b/ le fichier reste à l'exterieur de la base de données
           (utilisable par votre serveur WEB, par exemple)

     c/ le serveur Base de données peut vous fournir un contrôle de type:
                     - je vérifie que le fichier existe lors de l'insertion
                     - je vérifie la présence du fichier tant qu'il est
                           référencé dans la base.

  vous devez lancer un serveur TCP/IP appelé DLFM
       (DATA LINK FILE MANAGER), pour gérer ces contrôles temps réel.

 

 

ET ENFIN, orientation objets (V4R40)

    CREATE FUNCTION AF4TEST/N8_DATE (DEC(8 , 0) ) RETURNS DATE
           EXTERNAL NAME 'AF4TEST/DT_SQL(N8_DATE)'     (1)
           PARAMETER STYLE GENERAL                     (2)
           RETURNS NULL ON NULL INPUT  ;               (3)

 

(1) fait référence à N8_DATE dans DT_SQL
(2) le passage de paramètres se fait sans gestion de la val. nulle

(3) la fonction retourne nulle si un des argument est nul (il n'y aura pas d'appel)

 

Vous pouvez aussi créer des fonctions à l'aide du PL/SQL

CREATE FUNCTION BDVIN0.TODATE (
   DATIN DECIMAL(8, 0) )
   RETURNS DATE
LANGUAGE SQL
BEGIN

RETURN
 DATE ( LEFT ( DATIN , 4 ) CONCAT '-' CONCAT
 SUBSTR ( DATIN , 5 , 2 ) CONCAT '-' CONCAT
 RIGHT ( DATIN , 2 ) ) ;

END ;

V5R20 SQL admet maintenant
   les fonctions définies par l'utilisateur [UDF] de type TABLE
   utilisable par SELECT * FROM TABLE (nom-fonction() ) AS alias

  une fonction est un programme ou une procédure dans un programme de service
  enregistré(e) dans les catalogues SQL par CREATE FUNCTION.


   par exemple :

      CREATE FUNCTION QGPL/TBLIBL ( )
                     RETURNS  TABLE (LIB CHAR(10) , LIBTEXT CHAR(50) )
           EXTERNAL NAME 'AF4TEST/TBLIBL                      
      PARAMETER STYLE DB2SQL                       
            DISALLOW PARALLEL ; 
-- DISALLOW PARRALLEL est obligatoire pour une fonction table


Utilisation
----------- select * from TABLE( qgpl/tblibl() ) as libl
  where libtext like '%AF400%'

D'ailleur IBM écrit de plus en plus de fonctions TABLE pour accèder à des informations système (IBM i services)

 


Les versions 5.2 et 5.3 amènent aussi les clés générées automatiquement

 
Du coup, pour récupérer la valeur générée, utilisez :

SELECT cle_auto FROM FINAL TABLE (
   INSERT INTO fournisseur  (raisoc, quand) VALUES('IBM', now() )
)


 

La version 7 propose le Type XML

CREATE SCHEMA POSAMPLE;
SET CURRENT SCHEMA POSAMPLE;
CREATE TABLE CUSTOMER ( CID BIGINT NOT NULL PRIMARY KEY , INFO XML ) ;

Les champs de type XML peuvent faire jusqu'à 2 Go, la totalité d'une ligne ne peut pas dépasser 3,5 Go.

Puis insertion de données,

INSERT INTO Customer (Cid, Info) VALUES (1000,        
'<customerinfo xmlns="http://posample.org" Cid="1000">
<name>Kathy Smith</name>
<addr country="Canada">
<street>5 Rosewood</street>
<city>Toronto</city>
<prov-state>Ontario</prov-state>
<pcode-zip>M6W 1E6</pcode-zip>
</addr>
<phone type="work">416-555-1358</phone>
</customerinfo>')

Vous pouvez aussi utiliser les fonctions SQL, nouvelles en V7 :

le document doit être bien formé, sinon vous recevrez SQ20398

 

Il est possible d'associer un schéma XSD par la procédure XRS_REGISTER

la validation étant réalisée ensuite par XMLVALIDATE, SQL20399, signalant un flux XML non valide

INSERT INTO POSAMPLE.Customer(Cid, Info) VALUES (1004, 
XMLVALIDATE (XMLPARSE (DOCUMENT '<customerinfo xmlns="http://posample.org" Cid="1003"> <name>Robert Shoemaker</name> <phone type="work">905-555-7258</phone> <phone type="home">416-555-2937</phone> <phone type="cell">905-555-8743</phone> <phone type="cottage">613-555-3278</phone> </customerinfo>' PRESERVE WHITESPACE ) ACCORDING TO XMLSCHEMA ID posample.customer ));
--------------------------------------------------------------------------------------------------
Etat SQL : 2201R
Code fournisseur : -20399
Message : [SQ20399] Echec de l'analyse syntaxique ou de la validation XML. Cause . . . . . : L'analyse syntaxique XML a échoué pendant la validation.
Le décalage en octets dans la valeur XML en cours de traitement après conversion en UTF-8 est de 109.
La description de l'erreur de l'analyseur syntaxique XML est la suivante : cvc-complex-type.2.4.a:
Expecting element with local name "addr" but saw "phone". Que faire . . . : Corrigez l'incident lié au document de l'instance XML.
Relancez XMLVALIDATE ou XDBDECOMPXML.

 

le schéma pouvant contenir des annotations propres à DB2 (Ajouter l'espace de nommage db2-xdb), permettant un "mapping" xml -> relationnel,

c'est à dire une décomposition des données XML dans une ou des tables par la procédure XDBDECOMPXML

 

SQL admet aussi à cette version (V7) de nouvelles fonctions pour produire du XML


A l'inverse la nouvelle fonction XMLTABLE "parse" le flux XML et permet de réaliser un Select sur celui-ci.

Soit les données suivantes :

INSERT INTO Customer (Cid, Info) VALUES (1000,        
'<customerinfo Cid="1000">
<name>Kathy Smith</name>
<addr country="Canada">
<street>5 Rosewood</street>
<city>Toronto</city>
<prov-state>Ontario</prov-state>
<pcode-zip>M6W 1E6</pcode-zip>
</addr>
<phone type="work">416-555-1358</phone>
</customerinfo>') INSERT INTO Customer (Cid, Info) VALUES (1002,
'<customerinfo Cid="1002">
<name>Jim Noodle</name>
<addr country="Canada">
<street>25 EastCreek</street>
<city>Markham</city>
<prov-state>Ontario</prov-state>
<pcode-zip>N9C 3T6</pcode-zip>
</addr>
<phone type="work">905-555-7258</phone>
</customerinfo>') INSERT INTO Customer (Cid, Info) VALUES (1003,
'<customerinfo Cid="1003">
<name>Robert Shoemaker</name>
<addr country="Canada">
<street>1596 Baseline</street>
<city>Aurora</city>
<prov-state>Ontario</prov-state>
<pcode-zip>N8X 7F8</pcode-zip>
</addr>
<phone type="work">905-555-2937</phone>
</customerinfo>')
SELECT X.NOM, X.RUE, X.VILLE  FROM Customer, 
 XMLTABLE ('$c/customerinfo' passing INFO as "c"
     COLUMNS
      NOM     	CHAR(30)    PATH 'name',
      RUE	VARCHAR(25) PATH 'addr/street',
      VILLE    VARCHAR(25)   PATH 'addr/city'
  ) AS X

Affiche

....+....1....+....2....+....3....+....4....+....5....+....6....+....7
NOM RUE VILLE
Kathy Smith 5 Rosewood Toronto
Jim Noodle 1150 Maple Drive Newtown
Robert Shoemaker 1596 Baseline Aurora
******** Fin de données ********
Ce flux pouvant être lut directement depuis le Net par HTTPGETBLOB | HTTPGETCLOB

select * from XMLTABLE(
'$bce/*:Envelope/*:Cube/*:Cube/*:Cube'
PASSING XMLPARSE(DOCUMENT
systools.httpgetblob('http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml', '') ) as "bce"
COLUMNS
devise char(5) PATH '@currency',
taux dec(7 , 2) PATH '@rate'
) as txml
where devise = 'USD'; Affiche
....+....1....+...
DEVISE TAUX
USD 1,08


La version 7.2 propose une gestion plus fine des droits : RCAC

Row and Column Access Control

Il s'agit de pouvoir indiquer des « droits » à la colonne ou à la ligne qui s'appliquent y compris aux personnes ayant les droits d'administrateur

•CREATE MASK indique si une colonne est retournée tel que ou totalement/partiellement masquée ('xxx-xxx-xxx-1234' pour un n° de CB)

CREATE [or REPLACE] MASK tel_MASK ON bdvin1/producteurs
 FOR COLUMN pr_tel RETURN
  CASE
    WHEN SESSION_USER = 'QSECOFR'                                          
                                               THEN PR_TEL
    WHEN SESSION_USER = 'CM'
                                               THEN left(pr_tel , 3) concat 'XXXXXXXXXXXXX'
    ELSE NULL
END
ENABLE

Puis
ALTER TABLE bdvin1/producteurs
  ACTIVATE COLUMN ACCESS CONTROL



•CREATE PERMISSION indique la(les) règles(s) qui font qu'une ligne peut être vue

Toute ligne ne correspondant pas à la règle est masquée :

Exemple CM ne doit pas voir l'appellation 13 :

CREATE [or REPLACE] PERMISSION VINS_ROW_ACCESS ON bdvin1/vins
FOR ROWS
 WHERE
     SESSION_USER <> 'CM'
         OR (SESSION_USER = 'CM'
                  and (appel_code <> 13 or appel_code IS NULL)
               )
ENFORCED FOR ALL ACCESS
ENABLE
rappelez vous, on indique ce qui peut être vu (une affirmation, donc)


Puis
ALTER TABLE bdvin1/vins
  ACTIVATE ROW ACCESS CONTROL


ET une option a CREATE TABLE : CREATE OR REPLACE TABLE



Enfin un correctif de Juin 2015 (TR2) ajoute une intégration du format JSON

 

 

La version 7.3 propose de nombreuses fonctions de statistique (correlation, régression lineaire, etc...)

 

et les tables temporelles


Chaque action (Insert, Update, Delete) est automatiquement historisée dans la table historique

 

Définition de CLIENTS (association avec la table temporelle)

Permettant

 

Select * From clients
 for system_time as of '2016-02-10-12.00.00.00000000000'

Qui affiche les clients comme si on était le 10 Février 2016

 

Cette version propose des fonctions pour produire du JSON

Enfin, LIMIT est accepté sur DELETE et UPDATE

-- supprimer les 10 plus anciennes commandes
DELETE
FROM Commandes where nocli = 45 order by DATCMD LIMIT 10

Exemple


 

Le produit DB2 mirror for i représente la nouveauté la plus remarquable de la version 7.4

 

 


System i Navigator

 

Pour terminer, au fur et à mesure des versions, nous avons la possibilité d'avoir une vision graphique de la base de données, d'abord via System I Navigator :

 

Puis, maintenant, avec IBM i Access client solution

 

Include permet de choisir les bibliothèques à afficher




Toutes les listes peuvent être sauvegardées

   

 

Toutes les listes peuvent être paramétrées

(dans l'ordre des trois boutons)

 

Pour créer, en mode assistance, cliquez avec le bouton droit : "nouveau/table"



Paramètres généraux


Définition des colonnes


Exemple d'une colonne "Identity"


Vous pouvez aller "copier" une définition existante


et voilà !


Primary Key


Foreign Key




Check Constraint


Retrouvons l'ordre SQL qui va être lancé (Show SQL)



Sur un objet existant , nous pouvons retrouver le code à partir du catalogue SQL.


  --> Option Generate SQL

 

• Gestion des index

Vous pouvez demander la liste des index pour un bibliothèque entière ou bien, table par table

 

Création d'un Index





• Création d'une vue





• Création d'une fonction (ici Externe, c'est à dire existant déjà en tant qu'objet *PGM ou *SRVPGM))


• Création d'une procédure (toujours externe)


• Création d'un Trigger (SQL cette fois)


Choix des événements déclencheurs


Corps du Trigger


Création d'une permission (qui a le droit à la ligne ? dans le cadre de RCAC)


• Création d'un masque (qui a le droit de voir la colonne ? toujours RCAC)


• Création d'un Alias


• Création d'une Séquence



• Création d'une Variable globale



Une fois la base créée, ACS permet une administration complète

Enfin, vous pouvez lancer le gestionnaire de scripts SQL

Vous pouvez :


une option ALLOW SAVE RESULT, permet la sauvegarde des enregistrements extraits:

ensuite, avec un clic droit sur les lignes affichées :


Les formats admis, sont :

Plusieurs paramètrages de la connexion (JDBC) peuvent être mémorisés





Vous choisissez ensuite comme ceci :


Enfin,lancer l'outils d'analyse Visual Explain





Pour une surveillance globale des performances base de données, vous aurez le choix entre :

1/ les moniteurs de performance

2/ le cache des plans d'accès


Le jeu d'instructions actuellement en cache pouvant être sauvegardé sous forme d'image (snapshot).
(sinon, il y a mise à blanc à l'IPL)


3/ et enfin, nous pouvons demander à voir les recommandations faites pendant la constituion de ce cache.

Depuis la V5R40, le système note les index qui lui paraissent manquant dans QSYS2/SYSIXADV.

Initiation au développement



Comme la définition de la base de données qui peut être fait de deux manières :

  1. Langage historique SDD ou DDS
  2. SQL, permettant le support de plus de types de données (voir ci-dessous)

L'accès à la base peut se faire selon deux modes :

  1. Accès séquentiel indexé (dit "natif")
  2. SQL embarqué

L'accès natif :

 

Les fichiers sont déclarés par le biais de "spécif F"ou DCL-F (une déclaration par fichier manipulé) :

Attention, chaque nom doit être unique, les exemples suivants posent problème :

nom de fichier ET nom de format
 (par défaut, SQL donne un nom de format identique à la table, il faut alors utiliser RENAME)
nom de fichier ET nom de zone

noms de zone identiques ayant des attributs différents
 (nocli qui fait 6 dans le fichier clients et 7 dans le fichier commandes)

Quand le fichier est déclaré, le compilateur prévoit un "buffer" pour recevoir les lignes lues :

mais aussi

Le compilateur RPG a aussi prévu une variable RPG par colonne base de données, et celles-ci sont automatiquement alimentées par des spécif "I"


 

A noter qu'il se passe exactement l'opération inverse lors d'une écriture

 

Le compilateur doit être appelé, il va créé un objet *PGM, autonome quant à son exécution.

En cas de modification de la structure, pour éviter un décalage lors des lectures :

 

Ce n'est pas le cas avec SQL qui utilise des curseurs

 

et place directement les données du curseur dans des variables RPG (pas de buffer)

 


 

 

Comment moderniser la base de données / SQL vs DDS.

 

Le langage SQL est composé de sous ensembles

DDL


Data Definition Language (DDL) , instructions de création et de maintenance de la structure base de données
  • CREATE - création d'objets
  • ALTER - modification de structure
  • DROP - suppression d'objets
  • LABEL / COMMENT - documentation
  • RENAME - renommage d'objet

DML


Data Manipulation Language (DML) instructions de manipulation de données:
  • SELECT - lecture de données
  • INSERT - insertion de données
  • UPDATE - mise à jour de données
  • DELETE - suppression de données
  • MERGE - (insert or update)
  • CALL - Appel d'une procédure cataloguée

DCL


Data Control Language (DCL) instructions de gestion des droits:
  • GRANT - accord de droits
  • REVOKE - retrait de droits

 

Autant l'utilisation de DML se démocratise chez les clients IBM i , autant DDL reste minoritaire...

 

Pourtant IBM préconise l'utilisation de SQL (DDL) pour concevoir la base de données.

 

 

 

Voici la vision d'IBM concernant la phase de transition de modernisation de la base de données



Modernisation, phase 1

la phase 2 consiste à faire des modules d'accès à la base (*SRVPGM par exemple)

la phase 3 à reporter sur la base de données un maximum de logique métier

  • Intégrité référentielle
  • contraintes
  • Cryptage de données
  • Auto-Incrémentation

enfin, la phase 4 propose d'externaliser l'accès aux données

  • User Defined Fonction (UDF et UDTF)
  • Procédures cataloguées
  • etc....

 

Revenons à l'étape 1, le principe est le suivant :

  1. Conversion des fichiers physiques en tables SQL
  2. Création d'un logique SDD ayant le même format que l'ancien physique
  3. Recréation des différents logiques

Partons donc d'un fichier physique existant (bibliothèque FORMATION1) que nous souhaitons "moderniser" dans le Schéma TEST1

dont voici l'identifiant de format (3D99B1000F5D9)

La fonction génération d'instructions SQL permet de retrouver le source SQL
y compris des fichiers créés par SDD

Les fonctions non supportées sont notées en commentaire

Que nous transformons en :

Nous aurions aussi pu ajouter une zone AS ROW CHANGE TIMESTAMP, par exemple.

Créons ensuite le logique portant le même nom que l'ancien physique SDD (CLIENTP1)

Vérifions

 

© AF400 - Volubis