Pause-Café Volubis

pause-café

rendez-vous technique
Pause-Café est une réunion technique
destinée aux informaticiens sur plateforme IBM i.
Elle a lieu 3 à 4 fois par an : en Bretagne et sur internet.

Pause-café #40

Mai 2006



V5R40

 

Annonces matériel : Attention, nouveau nom : System I

> pour le reste, voir le System builder (attention, fichier .pdf de 9Mo)

Installation de la version

Attention, pré-requis :
  • vous devez avoir un disque load-source d'au moins 17Go.
  • 128 Mo doivent être alloués à la parition
  • vous devez impérativement allouer un espace supplémentaire pour le microcode (IPL obligatoire)
  • Si vous envisager d'utiliser la notion de catalogue d'images (voir ci dessous), vous devez avoir :
    • SI19886, si vous êtes en V5R2
    • SI19888, si vous êtes en V5R3

Le plus simple, ceci dit,  est vraiment d'utiliser la notion de catalogue d'images, apparue en V5R2.

  1. Créez une unité virtuelle par CRTDEVOPT DEVD(OPT02) RSRCNAME(*VRT) TYPE(632B)

    mettez l'unité VARY ON.

  2. Créez un catalogue d'image par CRTIMGCLG IMGCLG(V5R4) DIR('/V5R4') CRTDIR(*YES)

  3. Chargez les images de CD : ADDIMGCLGE IMGCLG(V5R4) FROMDEV(OPT01)
    pour tous les CD en commençant par le microcode

  4. Monter le catalogue sur l'unité virtuelle par LODIMGCLG IMGCLG(V5R4) DEV(OPT02) OPTION(*LOAD)

    ceci vous permettra ensuite sur le menu LICPGM, option 5 :
  1. de vérifier vos logiciels sous licences, À PARTIR DE opt02



  2. d'accepter par avance tous les contrats

  3. C'est ce même menu qui vous propose  l'option "Attribuer un espace supplémentaire pour le microcode".
    (il faut faire un IPL, qui peut être plus long que la normale)

Ensuite, passez la commande  VFYIMGCLG IMGCLG(V5R4) TYPE(*UPGRADE) SORT(*YES)

Puis faites votre IPL avec :

PWRDWNSYS OPTION(*IMMED)  
          RESTART(*YES)   
          IPLSRC(*IMGCLG) 
          IMGCLG(V5R4)    
                          
Nous avons personnellement, planifié cet IPL à 6H00 du Matin et à 8 heures l'OS était monté,
l'installation complète (avec les produits sous licence) étant terminée à 10H30.


L'installation des clés a changée, ces dernières sont à télécharger à l'URL http://www.ibm.com/servers/eserver/ess/

Vous recevez un document, avec un n° de commande, vous expliquant tout cela.


Vous devez avoir un ID IBM ou en créer un.




Entrez votre n°de commande, celui affiché sur le document recu.

Une fois enregistré, vous avez accès à vos clés :

option "key managment"



Attention, elles sont toutes là, depuis la V5R20, ne prenez que la version qui vous intéresse


L'option Download, télécharge un document contenant les clés et les commandes à passer




Vous pouvez aussi, enregistrez directement les clés sur votre machine, par une applet (option install) :





Il faut ensuite se connecter à votre I5 / AS400.


Le même site contient aussi vos preuves d'achat (PoE) qui sont devenues électroniques (ePoE)

Sur le menu principal choisissez entitlements


Choisissez votre code client et votre N° de série




        Vous pouvez afficher/imprimer chaque licence individuellement

remarquez le n° de commande, qui est celui envoyé sur le document livré avec la version
et aussi celui que vous avez saisi en début de transaction.

Nouveautés I5/OS


|
  V5R40, Nouveautés système 


 La gestion des travaux actifs montre l'utilisateur en cours
  (particulièrement pour les travaux de serveur, ici ODBC/JDBC)

                           Gestion des travaux actifs                  AS400
                                                             18/04/06  12:26
 % UC:    21,4     Intervalle:   00:01:39     Travaux actifs:   353

 Indiquez vos options, puis appuyez sur ENTREE.
   9=Exclure   10=Liste d'appel programmes   11=Gérer verrouillages
   12=Gérer unités d'exécution   14=Gérer exclusions mutuelles ...
                    Util
                    en
 Opt  S-syst/trav   cours       Type   % UC  Fonction        Etat
        QZSOSGND    QUSER       BCH     0,0                  SELW
        Q1PSCH      QPM400      BCH     0,0  DLY-60          DLYW
      QUSRWRK       QSYS        SBS     0,0                  DEQW
        QZDASOINIT  FORMATION1  PJ      0,0              TIMW
        QZDASOINIT  QUSER       PJ      0,0                  TIMW
        QZDASOINIT  FORMATION2  PJ      0,0                TIMW
..

|
 En ce qui concerne la gestion des performances, la documentation a enfin
  été réactualisée pour la V5R40 : " Systems management Performance."

 Elle fournit particulièrement une base de travail en ce qui concerne
  les tailles mémoire et la pagination des pools, qui avec la puissance
  des processeurs actuels a été revue.

 la nouvelle base de calcul est la suivante :

  - sur WRKSYSSTS, faites la somme de la pagination BD et non/BD pour
     chaque pool utilisateur (autre que le pool machine)

  - regardez l'UC consommée (en haut à gauche) et faites le calcul suivant:

     c*p, ou c est le pourcentage de CPU utilisé
             p est le nombre de processeurs de la partition

    par exemple 
     si vous avez une partition avec 1,8 processeur, utilisée à 80% = 144 
     si vous n'avez qu'un processeur utilisé à 60 % = 60 

    Aucun pool ne devrait avoir une pagination dépassant ce résultat.

|
                              Gestion d'un travail 
                                                  Système:   AS400    
 Travail:   QJVACMDSRV     Utilisateur:   QIBMHELP       Numéro:   167119 

 Choisissez l'une des options suivantes : 
  ............................

                                              :  L'affichage de la liste :
      1. Etat du travail                      :   d'appel des programme  :
      2. Attributs de définition              :   affiche de nouvelles   :
      3. Attributs d'exécution, si actif      :   informations           :
      4. Gestion des fichiers spoule          :..........................:

     10. Historique du travail, si actif, en file d'attente ou en instance 
  -> 11. Liste d'appel des programmes, si actif 
     12. Gestion des verrouillages, si actif 
     13. Liste des bibliothèques, si actif 
     14. Fichiers ouverts, si actif 
     15. Substitutions de fichiers, si actif 
     16. Etat du contrôle de validation, si actif 

 Option ou commande 
 ===> 11
 F3=Exit   F4=Invite   F9=Rappel   F12=Annuler 

|
                                 Liste d'appel 
                                               Système:   AS400    
 Travail:   QJVACMDSRV     Util:   QIBMHELP       Numéro:   167119 
 Unité exéc:   00000001 

 Type  Programme                Instruction       Procédure 
       QP0ZPCP2   QSYS                            _CXX_PEP__Fv                  
       QP0ZPCPN   QSYS          266               Qp0zNewProcess                
       QP0ZPCPN   QSYS          210               InvokeTargetPgm__FP11qp0z_p > 
       QJVACMDSRV QSYS                            _CXX_PEP__Fv                  
       QJVACMDSRV QSYS          13                main                          
       QJVAJVM    QSYS          215               RunJava                       
       QJVAJVM    QSYS          2                 CallStaticVoidMethod__7JNIE > 
       QJVAJNICLS QSYS          1                 CallStaticVoidMethodV__FP7J > 
  J    org/eclipse/core/laun >          000012C2  main                          
  J    org/eclipse/core/laun >          000011E6  main                          
  J    org/eclipse/core/laun >          0000110A  run                           
  J    org/eclipse/core/laun >          00001030  basicRun                      
  J    java/lang/reflect/Met >          00000F26  invoke                        
                                                                  A suivre...  
 F3=Exit   F5=Réafficher        F11=Groupe d'activation   F12=Annuler 
 F16=Menu travail   F17=Début   F18=Fin   F21=Inclure     F22=Zone entière 

|
                                 Liste d'appel 
                                            Système:   AS400    
 Travail:   QTOBDDNS       Util:   QTCP           Numéro:   167112 
 Unité exéc:   00000001 

 Type  Programme                Instruction       Procédure 
    1  QCMD       QSYS                     /01C7                                
       QTOBDNS8   QDNS                            _CXX_PEP__Fv                  
       QTOBDNS8   QDNS          14                main                          
       QP2USER    QSYS          4                 Qp2RunPase                    
       QP2USER2   QSYS          7                 __Qp2RunPase                  
       QP2USER2   QSYS          6                 runpase_main__FPi             
       QP2USER2   QSYS          2                 runpase_common__FiPvT2        
  P    NAMED8                           0000008C  __start                       
  P    NAMED8                           00000A38  main                          
  P    NAMED8                           000002F0  __evGetNext                   
  P    NAMED8                          00000110  pselect                       
  P+                                                                            
  P    libc.a(shr.o)                    0000009C  select                        
                                                                  A suivre...  
 F3=Exit   F5=Réafficher        F11=Groupe d'activation   F12=Annuler 
 F16=Menu travail   F17=Début   F18=Fin   F21=Inclure     F22=Zone entière 

|


 La colonne TYPE pouvant prendre les valeurs suivantes :

 Blanc : programme (OPM ou ILE) n'ayant pas pris un niveau de commande

 1/999 : programme ayant pris un niveau de commande

         un programme ayant pris un niveau de commande est un pgm dialoguant
          avec l'External (*EXT) dans la PGMQ, il intercepte les annulations
          (App/SYS 2 ou ENDRQS)
 V5R40
-------
 P     : Code utilisateur PASE i5/OS.
 P+    : Code utilisateur PASE i5/OS, dans lequel le point de reprise
          exact est incertain. Il peut y avoir jusqu'à deux lignes pour une
          entrée de la liste d'appel.
 L     : Microcode sous licence.
 K     : Code de noyau PASE i5/OS (Kernel).
 K+    : Code de noyau PASE i5/OS, dans lequel le point de reprise
         exact est incertain. Il peut y avoir jusqu'à deux lignes pour une
         entrée de la liste d'appel.
 J     : Code Java.

|
 Nouvelles valeurs système :


 QALWJOBITP : autorise ou non un job a être interrompu

            - 0 les travaux ne peuvent pas etre interrompu
            - 1 les travaux ne peuvent pas être interrompu, ce paramètre
                  peut être modifié pour un job, par l'API QWCCJITP
            - 2 les travaux peuvent être interrompu, ce paramètre peut
                  être enlevé pour un job, par l'API QWCCJITP

  L'interruption d'un job se réalise par l'API QWCJBITP, en lui passant,
   entre autre, le format JITP0100, contenant :
                     1/  CHAR(10)  Program name
                     2/  CHAR(10)  Program library
                     3/  CHAR(10)  Target job name
                     4/  CHAR(10)  Target job user
                     5/  CHAR(6)   Target job number
                     6/   CHAR(2)   (reservé)
                     7/  BINARY(4) Offset vers les données transmises au pgm
                     8/  BINARY(4) Lg des données transmises
                     9/  CHAR(*)   Données transmises
                    10/   CHAR(*)   (reservé)

|


 Le programme appellé lors de l'interruption DOIT avoir été déclaré
  par la commande ADDEXITPGM (option 8 de WRKREGINF) pour le point d'exit
  QIBM_QWC_JOBITPPGM, format JITP0100.

 Il recoit lui même les paramètres 8 ET 9 (données transmises et lg)

 Les données transmise ne peuvent dépasser 2000 c. de long.

  Quand un job est interrompu de cette manière :

   1/ un enregistrement J JS est écrit dans le journal d'AUDIT
       pour le travail source (celui qui demande l'inetrruption)

   2/ un message CPD1690 est enregistré dans la lOG du job interrompu
       et un enregistrement de type K JS est loggé dans l'AUDIT système

   3/ si le pgm se termine normalement un message CPD1691 est enregistré
       dans la LOG et un enregistrement L JS est noté dans l'AUDIT système

   4/ si le pgm se termine de manière Anormale, un message est enregistré
       dans la lOG (CPF18CE) et aucun trace n'est laissée dans l'AUDIT.

|


 QLOGOUTPUT : indique qui doit produire la LOG (historique papier) pour un
               job serveur.

            *JOBEND, l'historique est produite par le travail en fin de JOB.
            *JOBLOGSVR l'historique est produite par un "serveur de JOBLOG"
                       (travail QJOBLOGSVR dans QSYSWRK)

  la nouvelle commande WRKJOBLOG, permet de voir l'historique des travaux

     le paramètre JOBLOGSTT constitue le premire critère sur le status

         *PENDING : voir les travaux ayant l'historique en instance de
                     consitution.

         *SPOOLED : voir les travaux ayant l'historique en spool



         les paramètres PERIOD (date/heure de début et de fin)
                        et JOB (choix sur le nom et/ou l'utilisateur)
             constituant les autres critères

|
                       Gestion des historiques de travail              AS400
                                                             19/04/06  14:18
 Indiquez vos options, puis appuyez sur ENTREE.
   4=Supprimer   5=Afficher   8=Gérer fichiers spoule   12=Gérer travail

                                                             Numéro Données
 Opt  Date     Heure     Etat  Travail    Utilisat   Numéro  fich   utilisat
      12/04/06 08:48:20  *PND  QZDASOINIT QUSER      168565
      12/04/06 08:48:20  *PND  QZDASOINIT QUSER      168567
      12/04/06 08:48:20  *PND  QZDASOINIT QUSER      168256
      .../...

 L'option 4 propose de supprimer l'historique
            - Pour un travail en état *PND, l'API QWTRMVJL est utilisée
            - Pour un travail en état *SPL, la commande DLTSPLF est lancée

 L'option 5 permet de voir l'historique.
            - Pour un travail en état *PND, la commande DSPJOBLOG
            - Pour un travail en état *SPL, la commande DSPSPLF est lancée

 les options 8 (WRKSPLF) et 12 (WRKJOB) sont toujours les mêmes.

|
 Divers 


 QJOBMSGQMX accepte une valeur comprise entre 2Mo (avant 8) et 64Mo

 QHSTLOGSIZ admet une valeur comprise entre 1 et 10.000.000 (avant 65535)
   et la nouvelle valeur *DAILY demandant un fichier historique par JOUR.



 la commande CHGIPLA possède un nouvel attribut SPLFRCY( )
   indiquant ce qui doit être fait des spool, si la table des travaux
   est endommagée  :

    *DETACH, les spools sont notés comme détachés (voir nouveautés V5R30)
    *REMOVE, les spools sont détruit.

 Les routines QSPPUTF et QSPGETF disparraissent

   (en fait QSPPUTF existe encore, mais pour cette version uniquement)

 Conversion du format interne des DTAQ et USRQ.Cela peut prendre du temps
  sur les DTAQ journalisées.

|
 La notion de bande virtuelle vient completer celle de CD-ROM virtuel


 Rappel :
 --------

  Pour un CD-ROM virtuel :

   1/ on créé une unité optique virtuelle (par ex : OPT02)

   2/ on créé un catalogue d'images (de CD)

   3/ on charge les images par ADDIMGCLGE

   4/ on "monte" le catalogue sur l'unité optique par LODIMGCLG

  La version 5.30 supportant les DVD et le format associé (iso13346),
   il est possible de sauvegarder vers un DVD réinscriptible virtuel.

    taper : ADDIMGCLGE test FROMFILE(*NEW) TOFILE(image.udf)

    puis faire le LODIMGCLG, et l'initialisation (par INZOPT),
     enfin faire une sauvegarde vers OPT02

|


 la même notion vient d'être implémentée pour les unités BANDE

 1/ Création d'une unité bande virtuelle

  CRTDEVTAP DEVD(TAP02) RSRCNAME(*VRT) ASSIGN(*YES)
            TEXT('Unité Bande virtuelle')

  VRYCFG CFGOBJ(TAP02) CFGTYPE(*DEV) STATUS(*ON)



 2/ Création du catalogue d'images, et du fichier IFS.

  CRTIMGCLG IMGCLG(TAPVRT) DIR('/imgCatalog/tapcatalog') TYPE(*TAP)
             CRTDIR(*YES | *NO)



   ADDIMGCLGE IMGCLG(TAPVRT) FROMFILE(*new) TOFILE(volume01)
              IMGSIZ(*IMGCLGTYPE) VOLNAM(VOL01) 
              (la taille par défaut est de 1 Go)
   puis
   LODIMGCLG IMGCLG(TAPVRT) DEV(TAP02) OPTION(*LOAD)

|


  et enfin
  --------
    SAVLIB LIB(SPLF2) DEV(TAP02)         [pensez à SEQNBR( ) et CLEAR( ).]

  si vous indiquez VOl(*MOUNTED) et que la taille du volume est dépassée,
   vous recevrez CPF4901 :

    Fin de volume détectée pour fichier QSYSTAP de QSYS.

  dont la réponse par défaut (G), entraine la création d'un nouveau volume.

  si vous indiquez VOl(VOL01) et que la taille du volume est dépassée,
   vous recevrez le message d'interrogation CPA6798 :

    Pas de volume à monter sur l'unité TAP02. (C "ID cartouche")
      Réponse . .                                               

     si vous tapez un nom, un nouveau volume (ID cartouche) est créé

     si vous tapez "C", la sauvegarde est annulée et se termine par CPF3794

|


 Autre nouveauté liée aux sauvegardes, la possibilité de sauvegarder un
  sous ensemble du SAVSYS : SAVSYSINF 



  suite à la commande RTVSYSINF (V5R20) qui place toutes les informations
    système, suivantes dans une bibliothèque :

    *EDTD    : Codes d'édition utilisateurs
    *NETA    ; Attributs réseau
    *RPYLE   : Liste des réponses systèùe
    *SRVATR  : Attributs de service
    *SRVPVD  : Liste des prestataires de maintenance (WRKCNTINF / option 6)
    *SYSVAL  : Valeurs systèmes

    charge à vous de sauvegarder cette bibliothèque



  Toutes ces infos pouvant ensuite être ré-injectées par UPDSYSINF
   (totalement ou partiellement)



|


 La nouvelle commande de sauvegarde, sauvegarde en plus, les objets
     suivants de QSYS :

  > *JOBD, *JOBQ, *EDTD, *JRN, *SBSD, *CLS, *MSGQ, *TBL, *ICGDTA et *DTAARA
  > Les objets *CMD modifiés depuis la dernière commande SAVSYS
  > Les objets *MSGF modifiés depuis la dernière commande SAVSYS
  > Les PTF appliquées depuis la dernière commande SAVSYS

 ATTENTION, les éléments suivants ne SONT PAS sauvegardés et rendent
   la commande SAVSYS toujours obligatoire (même si moins fréquente)

   Microcode sous licence
   Bibliothèque QSYS
   Objets liés à la sécurité (et sauvegardés par SAVSECDTA)
   Objets liés à la configuration (et sauvegardés par SAVCFG)
   Valeurs système liées à la date ou à l'heure

   ansi que les valeurs système non modifiables
    (QSRLNBR, QMODEL, QPRCFEAT, ...)



|


 Enfin, il est possible maintenant de sauvegarder les spools.

 1/ par OUTQ avec le paramètre SPLFDTA(*ALL) 

    qui sauvegarde les spools d'une OUTQ en même temps que l'OUTQ elle même

    cette nouveauté est due au fait que depuis la V5R30, on sait manipuler
     un spool sans avoir les coordonnées du job avec QSPLFACN à *DETACH

    sur la commande de restauration le paramètre SPLFDTA indique ce qui
     doit être fait :



      *NEW  les nouveaux spool doivent être restaurés

      *NONE aucun spool ne doit être restauré

    Vous remarquerez que pour restaurez un spool existant, la seule
     solution est de le détruire avant de lancer la commande de restauration



|

 2/ individuellement par API

     QSRSAVO : sauvegarde d'un objet, d'un profil et maintenant d'un spool
               (attention, APIassez complexe à manipuler, il faut écrire
                dans un *USRSPC la liste des éléments à sauvegarder)

     QSRRSTO : restauration



  Enfin, les spools possèdent maintenant deux nouveaux paramètres
          permettant d'indiquer une date d'expiration, accessibles
          avec CRTPRTF, CHGPRTF, OVRPRTF et l'API QSRSAVO.

         EXPDATE( ) pouvant contenir *NONE, une date ou *DAYS
         DAYS( )    indiquant le nombre de jours si EXPDATE = *DAYS

 Les spools arrivés à expiration ne sont pas purgés automatiquement, vous
  devez lancer la commande : DLTEXPSPLF permettant d'indiquer un ASP ou *ALL

          DLTEXPSPLF ASPGRP(*ALL)

SQL


|
 La version 5.20 de l'OS/400 proposait de réaliser une requête sur le
   résultat d'une requête par la clause WITH.

 par exemple, sur une base vinicole :

  SELECT pr_code, count(*) from vins
    group by pr_code

  donne le nombre de vins produit par producteur

 mais impossible d'obtenir la moyenne générale avg(count(*)) étant refusé !

  WITH temp AS (  select pr_code, count(*) nbr from vins
                   group by pr_code )
   select avg(nbr) from temp  donne la moyenne générale (en une seule passe)

 nous pouvons alors demander la liste des producteurs > à la moyenne, par

  WITH temp AS (  select pr_code, count(*)  nbr from vins
                   group by pr_code )
   select * from temp where nbr > (select avg(nbr) from temp) 

|


 la clause WITH n'acceptait qu'un select simple (sans UNION et ORDER BY)

  ce n'est plus le cas en V5R40

 par exemple :

 WITH temp as (
                  select pr_code, count(*)  as nbr
                     from bdvin1/vins
                     group by pr_code
                union
                  select pr_code , 0 as nbr
                     from bdvin1/producteurs p
                     where not exists (select * from bdvin1/vins
                         where pr_code = p.pr_code)
  )
 SELECT avg(nbr) from temp

fait chuter la moyenne puisque cela inclut les producteurs n'ayant pas de
 vin enregistré dans la base.

|


 Si vous avez placé un order by dans la CTE (Common TABLE Expression), soit
  la table intermédiaire, matérialisée par la clause WITH,

 vous pouvez demander à ce que ce critère de tri soit respecté dans la
  requête finale par ORDER BY ORDER OF (le nom temporaire)

 par exemple :

  WITH temp AS (  select pr_code, count(*)  nbr from vins
                   group by pr_code order by nbr)
   select * from temp JOIN producteurs using (PR_CODE)
      where nbr > (select avg(nbr) from temp)
 ORDER BY ORDER OF temp, PR_NOM

 classe le résultat par nbr (comme temp) PUIS par nom.

 Vous remarquerez aussi que la clause ORDER BY accepte maintenant
  les ALIAS de colonne

  Avant il fallait répeter count(*) ou bien indiquer ORDER BY 2

|


 Deux fonctions très utiles pour les statistiques et le décisionnel (OLAP):

  ROW_NUMBER() numérote les lignes sur un critère de tri

  with temp as (
   select pr_code, count(*)  as nbr
     from bdvin1/vins
     group by pr_code
  )
  select row_number() over (order by nbr desc)  ,
          nbr , pr_code from temp

 Affiche :     ROW_NUMBER             NBR         PR_CODE
                        1              26           2.432
                        2              26           2.455
                        3              22           2.486
                        4              20           2.547
                        5              20           6.390
                        6              19           2.461
                        7              19           4.321
                        8              19           6.343

|


 RANK() attribue un rang non consécutif (en gérant les ex-aequo)
 DENSE_RANK() attribue un rang consécutif

  with temp as (
   select pr_code, count(*)  as nbr
     from bdvin1/vins
     group by pr_code
  )
  select rank() over (order by nbr desc)  ,
          nbr , pr_code from temp                    ! pour infos :
                                                     !
 Affiche :     RANK             NBR         PR_CODE  !   DENSE_RANK
                  1              26           2.432  !           1
                  1              26           2.455  !           1
                  3              22           2.486  !           2
                  4              20           2.547  !           3
                  4              20           6.390  !           3
                  6              19           2.461  !           4
                  6              19           4.321  !           4
                  6              19           6.343  !           4

|


 Dans tous les cas, le critère de tri à l'affichage (ORDER BY)
   peut être différent du critère indiqué dans OVER.

  WITH temp as (
   select pr_code, count(*)  as nbr
     from bdvin1/vins
     group by pr_code
  )
  SELECT rank() over (order by nbr desc)  ,
          nbr, pr_code from temp
          ORDER BY PR_CODE 

 Affiche    RANK             NBR         PR_CODE
           5.065               1               1
           2.582               3               2
           3.506               2               3
           5.065               1               4
           5.065               1               5
           5.065               1               6

 rappel: le même rang est attribué à toutes les lignes ayant la même valeur.

|


 Requêtes récursives
 --------------------

 Soit le fichier suivant :

   FILS        PERE         LIBELLE     
    01          00          LIB N°1
    02          01          LIB N°2
    03          02          LIB N°3
    04          00          LIB N°4
    05          00          LIB N°5
    06          03          LIB N°6
    07          00          LIB N°7
    08          00          LIB N°8
    09          00          LIB N°9
    10          00          LIB N°10
    11          09          LIB N°11
    12          07          LIB N°12
    13          01          LIB N°13
    14          12          LIB N°14
    15          14          LIB N°15

|
 Nous voulons afficher la ligne 'LIB N°1' et toutes les lignes dépendantes:


  Il faut, dans une clause WITH, afficher la ligne concernée, puis placer
   en dessous avec UNION ALL, le résultat de la jointure entre elle même 
   et le fichier des liens.

  WITH temp (NIVEAU, FILS, PERE, LIBELLE)
  as (select 1 , fils, pere, libelle
        from TBliens where libelle = 'LIB N°1'
  UNION ALL
      select P.niveau+1 , F.fils, P.fils , f.libelle
        from temp P join TBliens F on  F.pere=P.fils
     )
  SELECT * FROM TEMP

Affiche :
  NIVEAU   FILS        PERE        LIBELLE    
       1    01          00         LIB N°1
       2    02          01         LIB N°2
       2    13          01         LIB N°13
       3    03          02         LIB N°3
       4    06          03         LIB N°6

|
  WITH temp (NIVEAU, FILS, PERE, LIBELLE)
  as ( select 1 , fils, pere, libelle from TBliens where pere = '00' 
      UNION ALL
       select P.niveau+1 , F.fils, P.fils , f.libelle
        from temp P join TBliens F on  F.pere=P.fils )
  SELECT * FROM TEMP  , affiche l'arborescence complète : 
  NIVEAU   FILS        PERE        LIBELLE    
      1   01          00          LIB N°1
      1   04          00          LIB N°4
      1   05          00          LIB N°5
      1   07          00          LIB N°7
      1   08          00          LIB N°8
      1   09          00          LIB N°9
      1   10          00          LIB N°10
      2   02          01          LIB N°2
      2   13          01          LIB N°13
      2   12          07          LIB N°12
      2   11          09          LIB N°11
      3   03          02          LIB N°3
      3   14          12          LIB N°14
      4   06          03          LIB N°6
      4   15          14          LIB N°15

|


 Vous remarquerez que SQL traite les liens dans l'ordre ou ils apparaissent,
  c'est a dire dans l'ordre des niveaux

 Si vous souhaitez faire apparaitre toute la profondeur d'une branche
 (tous les fils de '01') avant de passer à la branche suivante, ajoutez :

  SEARCH DEPTH FIRST BY (un nom de colonne) SET nouvelle-colonne

  Indiquez 1/ un nom de colonne dont il faut analyser TOUTE la profondeur

           2/ un nom de colonne virtuelle à créér, ce flag interne sert
               à SQL pour savoir s'il a déja traité une ligne et DOIT
               être le critère de tri (ORDER BY) sur la requête finale

  WITH temp (NIVEAU, FILS, PERE, LIBELLE)
  as (select 1 , fils, pere, libelle from TBliens where pere = '00'
  UNION ALL
      select P.niveau+1 , F.fils, P.fils , f.libelle
        from temp P join TBliens F on  F.pere=P.fils )
   SEARCH DEPTH FIRST BY fils SET tri 
    Select * From Temp ORDER BY tri 

|


  NIVEAU   FILS        PERE        LIBELLE     
       1    01          00         LIB N°1
       2    02          01         LIB N°2
       3    03          02         LIB N°3
       4    06          03         LIB N°6
       2    13          01         LIB N°13
       1    04          00         LIB N°4
       1    05          00         LIB N°5
       1    07          00         LIB N°7
       2    12          07         LIB N°12
       3    14          12         LIB N°14
       4    15          14         LIB N°15
       1    08          00         LIB N°8
       1    09          00         LIB N°9
       2    11          09         LIB N°11
       1    10          00         LIB N°10



 Enfin, la clause CYCLE , évite les boucles infinies
  (si les données le permettaient)

|


 Imaginons notre fichier comme contenant des groupes de travail

   '01' est le responsable d'un groupe de travail, auquel participe
    indirectement '06', qui est lui même le responsable d'un groupe
    ou se trouve '00' (le grand chef) ==> AIE, AIE, on boucle.

  INSERT INTO TBLIENS values('00', '06', 'on boucle')

   --> sur une session 5250, il faut interrompre par appel système/2 !

 pour eviter cela

 CYCLE (nom de colonne) SET vartemp = valeur1 DEFAULT valeur0

 quand SQL va se rendre compte qu'il boucle (une ligne déja vue)

  il va attribuer à vartemp (nouvelle variable interne) la valeur valeur1
  (dans les autres cas, elle contient valeur0)

  la ligne va quand même être affichée, mais la boucle se termine

|
 Exemple avec :
  WITH temp (NIVEAU, FILS, PERE, LIBELLE)
  as ( toujours le même select ...
     )
   SEARCH DEPTH first by fils SET tri
   CYCLE FILS SET flag to '1' DEFAULT '0' 
  Select FLAG, niveau , fils, pere, libelle FROM temp
   ORDER BY tri

   FLAG      NIVEAU   FILS        PERE        LIBELLE    
    0             1    01          00         LIB N°1
    0             2    02          01         LIB N°2
    0             3    03          02         LIB N°3
    0             4    06          03         LIB N°6
    0             5    00          06         on boucle
    1             6    01          00         LIB N°1     <== déja vu !
    0             6    04          00         LIB N°4
    0             6    05          00         LIB N°5
    0             6    07          00         LIB N°7

  A vous donc de rajouter la CLAUSE CYCLE si vous craignez que les données
     puissent engendrer des boucles sans fin.

|


 ATTENTION, ces nouvelles fonctions :

            + fonctions OLAP (rank(), row_number(), etc..)
            + requêtes recursives
            + ORDER OF dans ORDER BY
            + les sous sélections contenant des SELECTS complets
                (avec UNION ou ORDER BY)
            + ainsi que les opérateurs EXCEPT et INTERSECT (V5R30)

   ne sont implémentées que par SQE (le nouveau moteur, disponible en V5R20)

   les cas suivants impliquent une utilisation de CQE (l'ancien moteur) :

         -> l'utilisation de TRANSLATE, UPPER/UCASE, LOWER/LCASE
         -> un tri basé sur STRSEQ(*LANGIDUNQ) ou STRSEQ(*LANGIDSHR)
         -> l'utilisation de fonctions TABLE (UDTF)
         -> l'utilisation de logiques dans la clause FROM
         -> l'utilisation de tables ayant des logiques avec select/omit
            (sauf à utiliser  IGNORE_DERIVED_INDEX dans QAQQINI)

   SQE prend à sa charge en V5R40 l'utilisation de LIKE (pas en V5R30)

|


 par exemple, la requête suivante :
 ----------------------------------

   WITH temp (NIVEAU, FILS, PERE, LIBELLE)
   as (select 1 , fils, pere, libelle
         from TBliens where lower(libelle) = 'lib n°1'
   UNION ALL
       select P.niveau+1 , F.fils, P.fils , f.libelle
         from temp P join TBliens F on  F.pere=P.fils
      )
   Select * From Temp

 génère le code erreur SQL0255 : Fonction incompatible avec la requête.
  prévoyant 9 codes raison.

 le notre est le 5

   -- Code 5 -- Une expression récursive de table commune n'est pas
   compatible avec cette requête.



|
 Autre nouveautés :


-nouvelles fonctions



     LAST_DAYS(date) retourne la date correspondant au dernier jour du mois

          par exemple LAST_DAYS('2006-04-21') = 2006-04-30

     ADD_MONTHS(date, nbr) ajoute un nombre de mois à la date

         Attention, si la date est au dernier jour du mois, la date
                    calculée est aussi au dernier jour du mois

         par exemple DATE('2006-04-30) + 1 months = 2006-05-30
                     ADD_MONTHS('2006-04-30' , 1) = 2006-05-31

     GENERATE_UNIQUE() genère une valeur unique de type CHAR(13)
                          (basée sur le timestamp en cours)

                       la fonction TIMESTAMP() peut-être utilisée pour
                        convertir en clair la valeur générée.

|


     NEXT_DAY(date , 'JOUR')

                       retourne le timestamp de la prochaine date ayant le
                        jour demandé (sur 3 c ou 10c.) à partir de "date".

     valeurs admises :
                        'MON' ou 'LUN' ou 'LUNDI' pour le prochain Lundi
                        'TUE' ou 'MAR' ou 'MARDI', prochain Mardi
                        'WED' ou 'MER' ou 'MERCREDI', prochain Mercredi
                        'THU' ou 'JEU' ou 'JEUDI', prochain Jeudi
                        'FRI' ou 'VEN' ou 'VENDREDI', prochain Vendredi
                        'SAT' ou 'SAM' ou 'SAMEDI', prochain Samedi
                        'SUN' ou 'DIM' ou 'DIMANCHE', prochain Dimanche



     Exemple :

            NEXT_DAYS('2006-12-31' , 'DIM') => ' 2007-01-07-00.00.00.000000'





|


     ENCRYPT_TDES(data , pwd, astuce)
      comme ENCRYPT_RC2 mais en utilisant le cryptage "Triple DES"

         la valeur est retournée par DECRYPT_BIT, DECRYPT_BINARY, DECRYPT_DB
           et DECRYPT_CHAR, comme ENCRYPT_RC2

     RAISE_ERROR(sqlstate, 'diagnostic')

        permet de signaler une erreur dans un trigger ou une procédure
         cataloguée.

        SQLSTATE ne DOIT PAS commencer par '00', '01' et '02' qui sont
         réservés à SQL.

     VARCHAR_FORMAT(timestamp 'format')

         Transforme un timestamp en chaine avec choix du format

         le seul (!) format admis est 'YYYY-MM-DD HH24:MI:SS'

         la fonction TO_CHAR() est un alias et rend le même service.

|


-la fonction TIMESTAMP admet 'YYYY-MM-DD HH:MM:SS.000000' et
   'YYYY-MM-DD HH:MM:SS' comme format (avant 'YYYY-MM-DD.HH.MM.SS.000000')

-les valeurs peuvent être comparées en ligne dans une clause WHERE

  exemple :
   select * from vins where (cepage1, cepage2) = ('Syrah' , 'Grenache')

 ce qui va permettre d'écrire (sans la clause EXISTS)

   select * from clients where (societe, client) NOT IN
                               (select societe, client from commande)

 Avant la V5R40, il était préféréable d'utiliser :
 --------------
   select * from clients c where NOT EXISTS (select * from commande where
              societe = c.societe and client = c.client), qui reste vrai!

-L'ordre CREATE INDEX admet un nouveau paramètre PAGESIZE( en Ko)
         (correspond au nouveau paramètre PAGESIZE() de CRTLF)

|


-L'ordre CREATE TABLE admet un nouveau paramètre RCDFMT, permettant
   d'indiquer un nom de format :

  create table client
   (nocli  integer,
    nom char(35)
   )
  RCDFMT clientf1

-Lors d'une lecture avec choix du niveau d'isolation RS ou RR

   RS = Read Serialisable
        => Les lignes lues et manipulées sont verouillées jusqu'au COMMIT
           (seules les lignes sans verrouillage sont lues)
   RR = Repetable read
        => Les lignes lues et manipulées sont verouillées jusqu'au COMMIT
           les tables sont allouées (insertion impossible) jusqu'au COMMIT.

 vous pouvez ajouter maintenant USE AND KEEP EXCLUSIVE LOCKS

  le verrouillage de chaque ligne passe de "lecture" à "mise à jour"

|
- LABEL ON INDEX est nouveau et change le texte de l'objet.


- limites : un nom de colonne passe de 30 à 128c.
            le nombre de tables dans une requete passe de 256 à 1000 !
             (cela reste 256 dans une vue)
            la taille d'une requête passe de 65 Ko à 2 Go.

- meilleurs temps de réponse des routines SQL PSM (il faut les recréer)

- nouveautés Procédures cataloguées :

  ALTER PROCEDURE permet de changer le paramétrage d'une procédure
                  cataloguée sans la détruire.

  SET CURRENT DEBUG MODE = ALLOW     (on peut faire du Debug)
                           DISALLOW  (on ne peut pas, mais on peut changer
                                      ce paramètre, par ALTER PROCEDURE)
                           DISABLED  (on ne pourra jamais faire de Debug)

  SET SESSION AUTHORISATION pour changer le profil actif du thread en cours.

  SET CURRENT DEGREE     = idem à CHGQREYA ou PARALLEL_DEGRE dans QAQQINI

|


 Le fichier QAQQINI admet un nouveau paramètre STORAGE_LIMIT qui vient
   compléter QUERY_TIME_LIMIT.

 ces deux paramètres sont aussi présents sur la commande CHGQRYA

  QRYTIMLMT permet de fixer un temps de traitement maxi
  QRYSTGLMT permet de fixer une taille temporaire à ne pas dépasser

   un nouveau point d'exit QIBM_QQQ_QUERY_GOVR vient compléter le tableau.

  si vous associez un pgm à ce point d'exit, il est appellé à chaque fois
   qu'une limite est dépassée.

  Votre programme recevera des informations système (format QRYG0100)
  contenant (entre autre)
     - le temps prévu et le temps maxi autorisé
     - la taille mémoire nécessaire et la taille maxi
     - la requête elle même...

   et devra indiquer si la requête doit être annulée ou non

|


   AU cas ou en tel programme n'existe pas ou s'il ne se prononce pas,
    vous recevez CPA4259.

                     Complément d'informations sur message 

 ID message . . . . . . :   CPA4259
 Date d'envoi . . . . . :   18/04/06      Heure d'envoi  . . . . :   17:45:0

  Message . . . . :   La requête excède la limite de durée ou de mémoire défini
  (C I)

  Cause . . . . . :   La requête de base de données qui allait démarrer a un
   durée d'exécution estimée à 1, ce qui excède la limite indiquée 21473525
   ou son utilisation de mémoire temporaire de 1 dépasse la limite spécifiée
   Les limites de durée de requête et de mémoire temporaire sont définies via
   la commande CL CHGQRYA.
 Que faire  . . . :   Tapez C pour annuler l'exécution de la requête ou I pour
   poursuivre.
 Réponses possibles :
   C -- Annuler l'exécution de la requête.
   I -- Ignorer la limite et exécuter la requête.

|
En demandant la suite du message, vous verrez :


                     Complément d'informations sur message 

 ID message . . . . . . :   CPA4259
 Date d'envoi . . . . . :   18/04/06      Heure d'envoi  . . . . :   17:45:0

 Technical description . . . . . . . . :   The following information explain
   the type of access plan used by the query. This information is similar to
   that which can be printed using the PRTSQLINF CL command.
                     PCLINUX                 QSECOFR                 169716
     Dernière sauvegarde du plan d'accès le 18/04/06 à 17:45:00.
     Substitution attributs de requête par options de requête du fichier
   QAQQINI de QUSRSYS.
     ODP réutilisable de tri utilisé.
     Réalisation de la requête pour position de jointure 1, table 1.
     Index VINS utilisé pour la table 1.
     Accès par index seulement utilisé sur la table 1.
     Réalisation de la requête pour position de jointure 2, table 1.
     Index VINS utilisé pour la table 1.
     Accès par index seulement utilisé sur la table 1.
     Tous les index ont été examinés pour la table 2.


  |
 parmis les nouveautés bien agréables de la V5R40, il y a l'intégration d'ordres 
SQL en format libre, dans le RPG en format libre


 Avant :
  /free
      ...
      exsr calnbv;
      ...
  /end-free

 C     calnbv        begsr
 C/EXEC SQL
 C+     SELECT cast(COUNT(*) as dec(3 , 0)) INTO :NBV FROM VINS
 C+      WHERE PR_CODE = :PR_CODE
 C/END-EXEC

 Maintenant :
  /free
   exec sql 
    SELECT cast(COUNT(*) as dec(3 , 0)) INTO :NBV FROM VINS
     WHERE PR_CODE = :PR_CODE ; 

|


Ce qui va être traduit par le pré-compilateur, par :

   //****xec sql
   //****SELECT cast(COUNT(*) as dec(3 , 0)) INTO :NBV FROM VINS
   //**** WHERE PR_CODE = :PR_CODE ;
  /END-FREE
 C                   EVAL      SQL_00005    = PR_CODE
 C                   Z-ADD     -4            SQLER6
 C                   CALL      SQLROUTE
 C                   PARM                    SQLCA
 C                   PARM                    SQL_00000
 C     SQL_00003     IFEQ      '1'
 C                   EVAL      NBV = SQL_00006
 C                   END
  /FREE



 Il n'y a toujours q'une seule instruction SQL par ordre exec sql .


|
• Nouveautés Iseries Navigator liées à la base de données

C'est une grosse version en ce qui concerne la gestion de DB2, particulièrement tout ce qui a trait aux performances.


remarquez l'accès aux index à reconstruire (commande EDTRBDAP)

1/ le centre de santé, analyse vos bases (les schémas affichés)




vous pouvez restreindre à une bibliothèque (ou un schéma)


affichage des informations relatives aux maximas de DB2.




2/ Nous avons ensuite accès au nouveau cache des plans d'accès SQL 
(ce concept date de la V5R20, mais n'était pas consultable, c'est lui aujourd'hui qui suggère les index)


Attention, le cache des plans d'accès n'est fait que par SQE, vous ne verrez donc pas de suggestion concernant les requêtes encore effectuées par CQE




3/ la visualisation de moniteur de perf.DataBase est beaucoup plus agréable :
  • vue globale :

  • avec des informations, classées par thème :


  • des récapitulatifs sont aussi disponibles :
, ci-dessous par utilisateur :



  • L'option "requêtes d'analyse" proposant un accès direct à toutes les requêtes (modification incluse)


  • "Affichage des instructions", sur un moniteur, propose maintenant de nombreux critères de sélection avant le moindre affichage.


  • critères que nous retrouverons lors du lancement d'un nouveau moniteur :



remarquez :
    • le critère : Adresse Internet (adresse IP) 
    • l'élimination des requêtes liées à l'activité système (iSeries navigator lui même, entre autre)

Choix des travaux (comme en V5R30)


et récapitulatif final.

L'accès au cache des plans SQL, propose ce type d'affichage, mais en temps réel, sans rien démarrer...


propriétés:


Affichage des instructions :


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


et réutilisé pour une comparaison





il n'est pas possible de comparer un jeu d'instructions venant du cache et un moniteur
(ils n'ont pas le même type, voyez ci-dessous)


4/ pour terminer, un accès à la copie de données est proposé directement depuis une table:


la plupart du temps cela affiche l'invite de la commande :


Sauf pour l'importation/l'exportation, où l'on vous propose un assistant.


Indiquez des critères de sélections :
    • sur une valeur de colonne
    • sur le N° de rang  : fonction SQL RRN()




Indiquez bien ASCII PC, sinon le fichier résultat est en EBCDIC.


La commande utilisée est CPYTOIMPF,
mais à partir d'une vue crée dans QTEMP si vous avez mis de critères.




Divers :

  • Iseries Navigator on the WEB
    1. Implique WAS 6.0 (au moins)
    2. Beaucoup plus de fonctions
    3. Toujours des problèmes de lenteur
  • WebAccess
    1. tourne aussi bien sous WAS que sous TOMCAT
      (ATTENTION, c'est la dernière version de TOMCAT supportée par IBM)
    2. quelques nouveautés

  • WebFacing et HATS
      1. deviennent un seul et même produit
        (HATS prend à sa charge les écrans non traités par Webfacing)
      2. facturable :
        • 120 $ par utilisateur
        • entre 5000 $ et 18000 $ par processeur
      3. N'utilisant plus de ressources interactives
  • Zend Core for I5/OS (PHP)
    1. produit Gratuit (en téléchargement) annoncé conjointement par IBM et Zend.
    2. Aujourd'hui il s'agit d'un produit "bizarre", tournant sous PASE et impliquant un serveur Apache2, installé par le produit, mais tournant lui aussi sous PASE.


    3. Ce produit devrait être complété en Juin par des annonces IBM, permettant entre autre une intégration avec les programmes RPG ou COBOL existant.


      A la prochaine PauseCafé, donc ...

Top

Copyright © 1995,2006 VOLUBIS