pause-café
destinée aux informaticiens sur plateforme IBM i.
Pause-café #84
TR8/ TR2
Améliorations de la 7.4 apportées par PTF :
TR2 (certaines fonctions sont communes à la TR8 de la 7.3)
IBM continue sur la lancée des versions précédentes en matière de livraison des nouveautés au fil de l'eau.
Ces dernières ont vu des améliorations livrées sous forme de TR, tous les six mois.
La TR2 de la 7.4 coïncide avec la TR8 de la 7.3. Rappel : il n'y a plus de TR en 7.2
Première remarque : il n'y a pas de PTF pour marquer la TR (ni en 7.4, ni en 7.3)
Il y a bien une microcode (MF99302 en 7.4, MF99208 en 7.3), mais pas de PTF sur SS1
il faut appliquer les dernières PTF sur DG1 et DB2, ainsi que la dernière cumulative
voir https://ibmsystemsmag.com/Power-Systems/05/2020/confusion-about-tr (pourquoi ?)
ACS en version 1.1.8.4
- Nouvelle option (très pratique) de comparaison de table (attention il faut des PTF)
- Choisir une table
- Aller sur l'autre table
option "compare to..."
- Only data : les données
- Only attributes : la structure (liste des zones longueur, etc...)
- Both data and attributes : les deux
- Gestionnaire de scripts SQL
- Meilleure gestion du ctrl+Espace
- sur les paramètres des procédures
- Sur les paramètres des fonctions
C'est particulièrement utile avec les fonctions table fournies par IBM (IBM i services)
Et du coup, la liste des colonnes retournées est proposée suivant le résultat de la fonction
- sur la liste des zones , vous pouvez aussi demander les textes (Edition/Content assist/Configuration)
- Enfin, fenêtre détail sur le résultat produit par une requête
- RDI 9.6.0.8
- Voir les correctifs
La seule nouveauté est l'intégration avec ACS, qui utilise la JVM de RDI
et deux PTF sur l'IBM i permettent de voir les variables en debug sur 30.000 c. (éditables du 4.096)
SI71302 (7.3) SI71314 (7.4) -> https://www.ibm.com/support/pages/apar/SE71579
- Voir les correctifs
- DB2 mirror
- DB2 mirror supporte désormais les disques internes
le clonage initial pouvant être fait par sauvegarde/restauration
Support for direct-attached storage
Db2 Mirror for i now supports using direct-attached storage, also known as internal storage. This support was previously limited to only external storage that supported some type of mirroring technology. Now save and restore can be used to set up Db2 Mirror for i. This support is limited to SAS-attached SSDs and NVMe. The save and restore method of configuration can also be used on external storage configurations that do not support mirroring or flash copy.
- DB2 mirror supporte désormais les disques internes
- Développement : DB2
Nouvelles fonctions SQL :
Interpret, force SQL à "caster" une chaîne, selon le type indiqué
Exemple avec la lecture d'un journal (fonction DISPLAY_JOURNAL)
- HASH_ROW retourne la valeur du codage SHA512 d'une ligne
(une signature de la totalité de la ligne)- permet de savoir si une ligne a été modifiée
- permet de comparer deux tables sur le n° de rang
- etc...
- JSON_TABLE
un Document JSON prend la forme {cle : valeur}
quand il prend directement la forme d'un tableau [{ cle : valeur }, { cle : valeur }, ...}], JSON_TABLE ne savait plus faire
Scott FORSTIE, donnait une astuce
ce n'est plus nécessaire
- CREATE DISTINCT TYPE
la notion de type utilisateur (UDT) est arrivée en même temps que les fonctions utilisateur (UDF) en V4R4
extrait de la pause café 19 !
Les types de données définis par l'utilisateur
ils sont créés par :
CREATE DISTINCT TYPE IMAGE AS BLOB(512K)
CREATE DISTINCT TYPE EUROS AS DECIMAL(9, 2)
CREATE DISTINCT TYPE FRANCS AS DECIMAL(9, 2)
vous pouvez maintenant créer une table par
CREATE TABLE VOITURES (CODE CHAR(10) NOT NULL PRIMARY KEY,
PRIXf FRANCS NOT NULL, PRIXe EUROS, PHOTO IMAGE)
la particularité de ces types est qu'ils sont fortement typés ,
c'est à dire que l'on ne PEUT PAS COMPARER DES FRANCS et DES EUROS.
WHERE PRIXF > PRIXE est syntaxiquement invalide !!!
WHERE PRIXF > 10000 aussi ! aïe...
seules des FONCTIONS supportant ces types sont habilitées à les manipuler.
Ce n'est plus vrai avec WITH WEAK TYPE RULES
Exemple de table
DSPFFD le montre
et bien sûr, pas de problème à l'utilisation
- Nous pouvons aussi déclarer des types à occurences, utilisables ensuite en PL/SQL
CREATE TYPE TEL AS DECIMAL(10,0) ARRAY[5]
ARRAY() permet d'assigner une liste de valeurs à un tableau
ARRAY_AGG() permet d'alimenter un tableau avec le résultat d'un SELECT
UNNEST() permet de d'alimenter un SELECT à partir d'un tableau
La fonction MAX_CARDINALITY permet de récupérer le nombre d'occurences
DECLARE APPELS TEL;
DECLARE NOMBRE INT;
SET NOMBRE = MAX_CARDINALITY(TEL); -- 5 éléments
la fonction TRIM_ARRAY permet de réduire le nombre d'occurences
CARDINALITY indique le nombre d'occurences actuel
DECLARE APPELS TEL;
DECLARE NOMBRE INT;
SET APPELS = TRIM_ARRAY(APPELS, 1); -- on enlève 1SET NOMBRE = CARDINALITY(TEL); --- plus que 4
ARRAY_TRIM est un nouveau synonyme pour TRIM_ARRAY
ARRAY_MAX_CARDINALITY est un nouveau synonyme pour MAX_CARDINALITY
- Extended Indicator
en SQL embedded, nous devons prévoir la valeur nulle lors d'une lecture par l'utilisation des variables indicateurs.
- SELECT ...INTO zone1:indicateur1, zone2:indicateur2, ....
- FETCH ..INTO zone1:indicateur1, zone2:indicateur2, ....
par exemple
Select nom, prenom into :nom:nomind, :prenom:prenomind
nomind et prenomind sont des variables binaires -> INT(5) en RPG, contenant : - >= 0 quand nom ou prenom ont un contenu significatif
- une valeur strictement positive, indique que la variable a été tronquée et vous donne la longueur d'origine.
- -1 quand nom contient valeur nulle (affiché - sur un terminal)
- -2 quand SQL n'arrive pas à produire un résultat (affiché +++ sur un terminal)
Avec l'option *EXTIND (option de compilation ou SET OPTION) , vous pouvez utiliser cela dans un UPDATE
- EXEC SQL
UPDATE personnel
SET NOM = :nom:nomind
PRENOM = :prenom:prenomind
les indicateurs peuvent alors contenir : - 0 quand nom ou prenom doivent avoir un contenu significatif
- -1,-2( aussi -3,-4,-6) quand nom doit contenir valeur nulle
- -5 quand nom doit contenir la valeur par défaut
- -7 quand la variable ne doit pas être traitée par UPDATE (avant il fallait écrire plusieurs UPDATE dynamiques)
- Cette notion a été intégrée au PL/SQL
SET newnom = SQLIND_DEFAULT;
SET newprenom = SQLIND_UNASSIGN
UPDATE personnel set nom = newnom, prenom = newprenom
Where matricule = monmatricule;
- Enfin, cette notion a été intégrée aux ouvertures de curseur par OPEN c1 SUBSET
Avant, si un ordre contenait deux ? (select * from personnel where nom = ? and prenom = ?)
vous deviez fournir le même nombre de variables lors de l'Open d'un curseur basé sur cette instruction
requete = 'select * from personnel where nom = ? and prenom = ?';
EXEC SQL prepare P1 from :requete;
EXEC SQL declare C1 cursor for P1;
nom = 'Rabbit';
prenom = 'Roger';
EXEC SQL OPEN C1 USING :nom, :prenom;// ....
if prenom <> ' ';
requete = 'select * from personnel where nom = ? and prenom = ?';
nomind = 0;prenomind = 0;
else;
requete = 'select * from personnel where nom = ? ';
nomind = 0;prenomind = -7;
endif;
EXEC SQL prepare P1 from :requete;
EXEC SQL declare C1 cursor for P1;
nom = 'Rabbit';
prenom = 'Roger';
EXEC SQL OPEN C1 USING SUBSET :nom:nomind, :prenom:prenomind;// ....
- Toujours en SQL embedded, nous pouvons prévenir d'une erreur :
- en testant SQLCODE, SQLSTATE
- en déclarant WHENEVER SQLERROR GOTO prb
cette dernière solution n'étant plus valide en freeRPG, car TAG n'est plus supporté- elle revient par EXEC SQL TAG prb; // uniquement dans un ordre SQL
- Syntaxe RPG
- %TIMESTAMP() retourne des microsecondes (avant, avec une précision de 3 uniquement=millisecondes)
la variable d'environnement suivante permet de fonctionner comme avant (millisecondes)
ADDENVVAR QIBM_RPG_DISABLE_TIMESTAMP_MICROSEC VALUE('Y')
- %TIMESTAMP(*UNIQUE) retourne un timestamp unique
- %KDS() admet un nombre de clefs variable en position 2
- LIKEDS peut faire référence à une DS imbriquée
- %TIMESTAMP() retourne des microsecondes (avant, avec une précision de 3 uniquement=millisecondes)
- SQL : Nouveaux services IBM i
- AUTO_START_JOB_INFO
Vue qui Affiche les travaux à démarrage automatiques - CERTIFICATE_INFO
Fonction table qui affiche les certificats d'un magasin de certificats
- DB_TRANSACTION_INFO
Vue qui affiche les transactions en cours (WRKCMTDFN)
- HTTP_SERVER_INFO
Vue qui affiche les serveurs web démarrés.
- IFS_OBJECTS_PRIVILEGES
Fonction table qui affiche les droits sur un fichier ou un répertoire de l'IFS - JOB_LOCK_INFO
Fonction table affichant les verrouillages d'un travail - LIBRARY_INFO
Fonction table donnant des informations sur une bibliothèque
- OBJECT_PRIVILEGES
Fonction table retournant les droits sur un objet
- PRESTART_JOB_INFO
Fonction table et vue qui retourne les travaux à démarrage anticipé d'un sous-système
- PRESTART_JOB_STATISTICS
Fonction table donnant des informations sur un travail à démarrage anticipé, comme DSPACTPJ
- ROUTING_ENTRY_INFO
Fonction table et vue qui retourne les postes de routage (ADDRTGE) d'un sous-système - SUBSYSTEM_INFO
Fonction table et vue qui retourne les informations générales d'un sous-système
- SUBSYSTEM_POOL_INFO
Fonction table et vue qui retourne les pools d'un sous-système
- WORKSTATION_INFO
Fonction table et vue qui retourne les entrées écran (ADDWSE) d'un sous-système
- SYSTOOLS.DELETE_OLD_SPOOL_FILES
Supprime tous les spools correspondant aux critères
Paramètres :- DELETE_OLDER_THAN : timestamp
- P_OUTQUEUE_LIBRARY_NAME : bibliothèque
- P_OUTQUEUE_NAME : nom de la file d'attente
- P_USER_NAME : Utilisateur
- PREVIEW
- YES : retourne un result sets de ce qui va être supprimer
- NO : supprime les spools
- DB2 for I services
- ANALYZE_CATALOG
Liste les erreurs du catalogue SQL (un peu comme RCLDBXREF) : attention, il faut être *ALLOBJ
- COMPARE_FILE
basé sur HASH_ROW et probablement utilisé par ACS (7.4 uniquement)
peut être utilisé pour comparer entre deux machines
- SYSTOOLS.VALIDATE_DATA : vérification d'un membre de fichier physique
- SYSTOOLS.VALIDATE_DATA_FILE : vérification de tous les membres d'un fichier
- SYSTOOLS.VALIDATE_DATA_LIBRARY : vérification de tous les fichiers d'une biblothèque
Vérifie que tous les champs numériques ne contiennent que des chiffres (PF encore utilisés en "interne" ?)
- ANALYZE_CATALOG
- Services amméliorés (en générale de nouvelles colonnes ont été ajoutées)
- AUTO_START_JOB_INFO
- Produits Open source
- Mise à jour du driver ODBC pour PASE
- PHP est livré en mode opensource sous forme de RPM
- il utilise le driver ODBC pour se connecter (pas de DB2_connect)
- dans le même temps ZEND annonce la fin de Zend Server, version gratuite
(https://www.zend.com/blog/zend-perforce-announcement-ibm-i-users) - Ca fera l'objet d'une partie de la prochaine Pause-Café 85
- Expect, permet de simuler une saisie clavier, utile avec ssh
- tmux : multiplexeur de terminal (nous en servirons nous ?)
- JQ : éditeur en ligne de commande sur le modèle de sed, mais pour du JSON
- et surtout PostgreSQL, base de donnée concurrent à Mysql
Après avoir installé et créé le repertoire pgdata (par exemple, il n'y a pas de nom reservé)- pg_ctl init
- pg_ctl start
- de fait sur le port 5432
- Accès en mode commande : psql
psql (sans paramètre) on se connecte à une base portant le nom de l'utilisateur en cours
psql db : on se connecte à la base "db"
\connect pour "changer" de base (comme use avec mysql)
\q pour sortir
voir les autres méta commandes
Sinon installez phpPgAdmin
- Accès en mode commande : psql
- Zstandard outil de compression
- et le classique 7Zip
- Enfin, OpenJDK 11 en mode "early access" pour tester dans un container chroot, par exemple
- pg_ctl init
- Mise à jour du driver ODBC pour PASE
- Serveur de web services
-
Rappel sur les paramètres OUTPUT
-
Un des paramètres , de type INT(10) peut contenir le HTTPSatus (le code)
Il n'est alors PAS retourné avec les données -
Un des paramètres , Tableau de type CHAR() peut contenir les HTTPheader (les entêtes)
Chaque occurrence significative contient une entête sous la forme nom:valeur
Ce paramètre n'est alors PAS retourné avec les données
- Extrait du code RPG
et s'il signale une erreur (> 400) aucune donnée n'était retournée avant la TR2/TR8
Nouveautés TR2/TR8
-
- Nouvelle interface pour saisir les coordonnées de l'objet à déployer
-
Les noms de structure sont modifiables (Important pour le XML c'est le nom "racine")
par défaut, toujours "nom-de-procédure"Input ou "nom-de-procédure"ResultOn peut préciser les status HTTP et indiquer un message d'erreur significatif
On peut forcer une entête HTTP (en tant que constante)
ET surtout, retourner un code erreur n'empèche plus de retourner des données
exemple avec ce pgm
Error response output parameter est une nouveauté
TESTONSune date valide
une date invalide
Nous ne recevons que P3
Attention p3 doit être formaté comme indiqué ici
Sinon
Cela risque de sembler incohérent au client
-