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.
- Créez une
unité virtuelle par CRTDEVOPT DEVD(OPT02) RSRCNAME(*VRT)
TYPE(632B)
mettez l'unité VARY ON.
- Créez
un catalogue d'image par CRTIMGCLG IMGCLG(V5R4) DIR('/V5R4')
CRTDIR(*YES)
- Chargez les images de CD :
ADDIMGCLGE IMGCLG(V5R4) FROMDEV(OPT01)
pour
tous les CD en commençant par le microcode
- 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 :
- de vérifier
vos logiciels sous licences, À PARTIR DE opt02
- d'accepter par avance
tous les contrats
- 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 :
- 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
- Implique WAS 6.0 (au moins)
- Beaucoup plus de fonctions
- Toujours des problèmes de lenteur
- WebAccess
- tourne aussi bien sous WAS que sous TOMCAT
(ATTENTION, c'est la dernière version de TOMCAT supportée
par IBM)
- quelques nouveautés
- WebFacing et HATS
- deviennent un seul et même produit
(HATS prend à sa charge les écrans non traités par
Webfacing)
- facturable :
- 120 $ par utilisateur
- entre 5000 $ et 18000 $ par processeur
- N'utilisant plus de ressources interactives
- Zend Core for I5/OS (PHP)
- produit Gratuit (en téléchargement)
annoncé conjointement par IBM et Zend.
- 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.
- 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 ...
Copyright ©
1995,2006 VOLUBIS