|
Depuis 2001, chaque processeur accepte plusieurs partitions
depuis la V3R10 |
spécifs C en format libre il s'agit de lignes blanches (sans la lettre C en colonne 6) situées entre /free et /end-free (colonne 7) l'instruction peut être éclatée sur plusieurs lignes (sans caractère + ) la fin de CHAQUE instruction étant marquée par " ; " /free test(E) date ; // commentaire if not %error ; date = date + %DAYS(1) ; nbjours = %DIFF(date : undimanche : *DAYS); joursemaine = %rem(nbjours : 7); if joursemaine < 1; joursemaine = joursemaine + 1; endif; *inlr = *on; endif; return; /end-free |
par exemple, un pgm de vérification de l'adresse mail
peut maintenant être écrit :
ILE permettant d'écrire nos propres fonctions, afin d'enrichir
le langage
La version 7.2 apporte aussi le format libre dans les déclarations
WDSc est un produit IBM faisant partie du produit 5722WDS, RDI RDP sont facturés séparément
Il est basé sur ECLIPSE, un IDE en licence publique d'initiative IBM, comprenant :.
Au dessus d'éclipse, IBM vend un produit WSSD , successeur de Websphere studio et de VisualAge pour JAVA.
il vous permet
WDSc, est la version Iseries de ce produit, livrée en V5 avec I5/OS V5r3, V6 puis V7 en V5R40 et comprenant :
L'interet du serveur Apache2 sous Pase (c'est véritablement celui d'UNIX) pour Zend, c'est de réutilsier les routines existantes, particulièrement celles permettant de lancer PHP en mode module, ce qui offre les meilleures performances et le debug avec ZendStudio.
Dès 2010, la société ZEND propose un successeur nommé Zend SERVER et intégrant la norme Fast CGI.
1/ Vous devez avoir les logiciels sous licence suivants :
2/ Téléchargez le fichier zippé sur le site de ZEND, dézippez et transférez (en binaire) via FTP le SAVF dans QGPL
3/ Passez ensuite la commande RSTLICPGM LICPGM(1ZCORE5) ou RSTLICPGM LICPGM(2ZSVRPI)
Vous aurez ensuite accès à la console d'administration (sur le port 89 pour zendcore , 10088 pour zendserver)
![]()
Enfin vous pouvez utiliser Zend Studio for I5/OS
(en attendant l'intégration de ce produit dans Eclipse, dixit IBM)
Contenant un éditeur PHP tout à fait sympathique
En version 7.1 une alternative à PHP est proposée nommé Ruby On rails
![]()
il ne manque plus en V5R20 que la gestion des unités (WRKCFGSTS)
![]() |
Vous retrouverez les principales options de gestion d'un AS/400, sous forme arborescente :
|
Chaque utilisation d'une option fait apparaitre une liste dans la fenêtre de droite. Cette fenêtre peut être paramétrée par :
DB2/400 de la V3 (1995) à la V7(2014)
Rappel sur des fonctions de DB2/400 récentes et donc, parfois, sous-employées :
Variables de Type DATE, HEURE, HORODATAGE
Remarques : ce n'est supporté QUE par le compilateur ILE/RPG-IV ET SQL
Notion de variable obligatoire/facultative (valeur NULLE)
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é : Notion d'unicité
Notion de clé primaire
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)
contraintes de domaine depuis la V4R20
vérification de type comp, range, values avec des constantes ou avec d'autres colonnes du même fichier.
quelques exemples
ADDPFCST FILE(CLIENT) TYPE(*PRIKEY) KEY(NOCLI) CST(client_unique)
ADDPFCST FILE(ENTCDE) TYPE(*REFCST) KEY(NOCLI) CST(client_existe) PRNFILE(CLIENT)
ADDPFCST FILE(ENTCDE) TYPE(*CHKCST) CST('commande_valide') CHKCST('nocde > 0 and datliv > datcde')
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 reçu en tant que paramètre.
En V5R10, les triggers peuvent être écrits en SQL PSM
ils peuvent être liés à une colonne (300 Triggers possibles par fichier)
Les triggers peuvent être écrit dans n'importe quel langage
C, RPG III ou IV ,COBOL, depuis la V5R10 en SQL PSM (comme le PL/SQL)exemple :
ADDPFTRG FILE(ENTCDE) TRGTIME(*AFTER) TRGEVENT(*UPDATE) PGM(MONPGM) ALWREPCHG(*YES)
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 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 toujours, le RIGHT OUTER JOIN est admisEN V5r30 la clause USING peut être utilisée : select * from vins join producteurs using(pr_code)
ainsi que les opérateurs EXCEPT et INTERSECT
DRDA
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)
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 reconnaît 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:
BeginDeclare 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é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.
SUPPRIMER les clients sans commande :
Delete from client C where not exists
( select * from commande where nocli = C.nocli )
supprimer les commandes quand la clause SELECT ne trouve
pas de ligne (NOT EXISTS)
ayant le n° de client lu dans le fichier client (C.nocli)Cette syntaxe est maintenant acceptée dans la clause SET de UPDATE
UPDATE command C set priha = (select pritarif from article WHERE codart = C.codart ) WHERE priha = 0mettre à jour le fichier command, mettre dans priha la valeur retournée par la clause select qui dit
(je vais chercher le pritarif dans le fichier article,
de la ligne ayant le code article lu dans le fichier commande )
- 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.
with temp as (select count(*) as nbr from Fmodules group by codmodul) select max(nbr) from temp
deux nouveaux types de donnée 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 Chararcter 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)
les fonctions définies par l'utilisateur [UDF]
les types de données définis par l'utilisateur [UDT]
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 :
notre routine RGP4 de vérification de mail, peut devenir
![]()
Etre compilée par CRTRPGMOD puis CRTSRVPGM SRVMAIL ... EXPORT(*ALL)
et enfin, être déclarée à SQL, par :CREATE FUNCTION AF4TEST/CHKMAIL ( CHAR(50) ) RETURNS CHAR(1)
EXTERNAL NAME 'AF4TEST/SRVMAIL(CHKMAIL)' (1)
PARAMETER STYLE GENERAL (2)
RETURNS NULL ON NULL INPUT ; (3)
(1) fait référence à CHKMAIL dans SRVMAIL (*SRVPGM)
(2) le passage de paramètres se fait sans gestion de la val. nulle (3)
la fonction retourne nul 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
les versions 5.2 et 5.3 amènent les clés générées automatiquement (compteur)
WITH temp (composant, compose, quantite) as (select L.composant, L.compose, L.quantite from liens L where composant = 'voiture' UNION ALL select fils.composant , fils.compose, fils.quantite from temp AS Pere join liens AS Fils on pere.compose=Fils.composant ) SELECT * FROM TEMP |
LA V6R10 continue la série des options OLAP, cette fois pour le GROUP BY
soit le SELECT basique suivant --> |
SELECT SOC, DEP, Count(*) .../... GROUP BY (soc, Dep)
|
|||||||||||||||||||||||||||||||||
GROUPING SET * |
affiche les totaux pour 2 GROUPES consécutifs |
SELECT SOC, DEP, Count(*) ...GROUP BY Grouping
Set (soc, Dep)
|
||||||||||||||||||||||||||||||||
ROLLUP * |
affiche 1 total par groupe puis des ruptures de niveau supérieur |
SELECT SOC, DEP, Count(*) ... GROUP BY ROLLUP (soc,
Dep)
|
||||||||||||||||||||||||||||||||
CUBE * |
affiche les totaux pour tous les groupes possibles |
SELECT SOC, DEP, Count(*) GROUP BY CUBE (soc,
Dep)
|
||||||||||||||||||||||||||||||||
GROUPING() * |
indique si cette ligne est le résultat de ROLLUP (rupture) |
SELECT SOC, DEP, Count(*), GROUPING(DEP) GROUP BY ROLLUP (soc, Dep)
|
le code
SELECT * FROM XMLTABLE('$result/rss/channel/item'
PASSING XMLPARSE( DOCUMENT
SYSTOOLS.HTTPGETBLOB('http://www.redbooks.ibm.com/rss/iseries.xml','')
) as "result"
COLUMNS
title VARCHAR(128) PATH 'title',
description VARCHAR(1024) PATH 'description',
link VARCHAR(255) PATH 'link',
pubDate VARCHAR(20) PATH 'substring(pubDate, 1, 16)'
) AS RESULT;
permet de lire les un flux RSS de manière structurée :
•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 |
•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 |
enfin , au fur et à mesure des versions, nous avons la possibilité d'avoir une vision graphique de la base de données
via Iseries Navigator :
sur un fichier, vous pourrez éditer son contenu ( ATTENTION ! ) ,
mais aussi avec le menu contextuel (clic droit)- obtenir un aperçu (consultation uniquement)
- voir les caractéristiques d'un fichier (table ou vue)
(liste des champs ou description système)
![]()
remarquez ici, le nombre maxi d'enregistrements
créer un nouvel objet
Gérer les statistiques (nouvelle fonction de l'OS/400, pouvant éviter la création d'index)
Pour vos requêtes SQL, utilisez le gestionnaire de scripts CWBUNDBS.EXE
==> sur "base de données" (ou sur le nom "rdb" en 5.2), click droit, puis gestionnaire de scripts.
Vous pourrez :• sauvegarder et relire un script SQL• lancer tout ou partie du script
• voir l'historique du travail sur l'AS/400
• Obtenir des informations d'optimisation (VISUAL EXPLAIN)
![]()
ce dernier vous proposant, en V5r20, un outil de conseil (optimisation)
![]()
EN V6, Visual Explain
peut être lancé et réactualisé, pendant l'exécution, les informations ayant bougé sont surlignées.
Dès la V5R20 une aide précieuse à la saisie d'un ordre SQL est fournie par F4
Pour terminer le gestionnaire de scripts subit de nombreux changements en V6R10
1/ 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 :
- txt
- cvs
- Lotus 123
- tableur Excel
Les paramètres de connexion (JDBC) peuvent être modifiés temporairement ou définitivement
et proposent maintenant l'affichage des COLHDG plutôt que les noms de zone en entête de colonne
La(les) requêtes(s) peuvent être sauvegardée(s) sur le serveur (fichier physique ou IFS)
Ce qui accompagne très bien le nouveau paramètre SRCSTMF de la commande RUNSQLSTM
- L'option Database Navigator, permet de mieux voir les liens base de données
Enfin, iSeries navigator est l'outil idéal de surveillance des performances Base de données
En V5R40
- Le centre de santé affiche des informations sur vos base en % des maximas DB2
- Les moniteurs SQL propose des sélections (bibliothèque, tables, durée) au lancement et à l'affichage
- Consultation du cache des plans d'accès avec le même affichage que les moniteurs
- ce dernier suggérant les index manquant en temps réel (assistant de gestion des index)
- La liste des index indique quand un index a été utilisé, même implicitement pour la dernière fois
En V6R10
• Moniteurs
Sur un affichage récapitulatif, à l'affichage des instructions (Analyse, puis clic droit sur une ligne / instructions),
l'option fichier propose, maintenant, une sauvegarde de la liste des instructions SQL
Sur le même affichage, vous pouvez maintenant, placer la requête SQL dans le gestionnaire de script avec les valeurs des variables, ou les marqueurs SQL (?)
Enfin, vous pouvez comparer deux moniteurs
• Cache des plans d'accès
- la taille peut être ajustée par CALL QQQOOOCACH PARM('R:1024')
[tapez CALL QQQOOOCACH pour avoir une liste des paramètres.]
ou par iSeries Navigator V6 (Mémoire cache de plan SQL/propriétés)
![]()
Les possibilités d'affichage sur une instruction ont été étendues :
- l'affichage des instructions les plus longues est limité aux 500 premières
- vous pouvez demandez la liste des travaux utilisant actuellement cette instruction
- et la liste des utilisateurs ayant utilisé cette instruction (historique de l'utilisateur)
![]()
Vous pouviez déjà en V5R40 sauvegarder le cache sous forme d'images instantanées :
par l'interface graphique sous Images instantanées de mémoire cache de plan SQL
par la procédure cataloguée DUMP_PLAN_CACHE , qui en V6 est automatiquement enregistrée au même endroit.Quand le cache est plein il est automatiquement épuré, en V6 il est possible de placer un moniteur sur cet événement afin de le sauvegarder en fichier avant
• Gestion des index
Vous pouvez demander la liste des index pour un bibliothèque entière (et non table par table) en cliquant sur Tables
Vous remarquerez aussi l'affichage des MQT, la génération d'instruction SQL (toujours pour toute la bibliothèque)
l'assistant de gestion d'index (qui affiche les index suggérés, globalement, pour une bibliothèque ou pour une table) a été amélioré :
- Affichage de l'instruction SQL est nouveau en V6
- ainsi que l'accès direct aux instructions qui ont provoqué cette suggestion (dans le cache)
- l'assistant affiche aussi le nombre de fois ou un index a été suggéré et, s'il a été créé automatiquement (MTI), le nombre de fois ou il a été utilisé
Ce compteur peut-être réinitialisé pour la table, par le menu contextuel suivant :
![]()
L'affichage de l'instruction SQL pour un travail a été revu :
© AF400 - Volubis