V7R10, Nouveautés via PTF

    Avancées (principalement DB2) apportées via PTF en versions 6 et 7

    Extrait des avancées signalées par le site IBM i Technology Updates

    (en plus du CONNECT BY et des améliorations OmniFind, présentés séparement)

• Quand vous créez une procédure cataloguée elle est enregistrée dans SYSPROCS et SYSPARMS

Il existe un mécanisme qui l'enregistre à nouveau dans le catalogue système lors d'un RSTOBJ

Ce mécanisme de mise à jour du catalogue est désormais aussi assuré lors de l'utilisation des commandes :

• Le même niveau de correctif (19) permet de définir une valeur par défaut pour un paramètre de procédure

CREATE OR REPLACE PROCEDURE Creation_client
(IN NOCLI DEC( 6, 0), 
 IN DEPCLI CHAR(3) DEFAULT('44'),
 IN DATCLI DATE DEFAULT CURRENT DATE)
LANGUAGE SQL
BEGIN
 /* corps de la procédure */
END;



L'appel peut se faire ensuite sous la forme

  CALL Creation_client('123456')

  CALL Creation_client('123456', '22')

  CALL Creation_client('123456', '22', DEFAULT)


Les paramètres peuvent être nommés, afin d'éviter de renseigner un paramètre précédent par exemple

 CALL Creation_client('123456', DATCLI=>'2013-01-17')

La valeur par défaut peut même être "dynamique"

 IN DEPCLI CHAR(3) DEFAULT
    (SELECT depNum FROM departements WHERE deptNom='Morbihan')


 

• la PTF SF99701 level 18 propose deux nouvelles colonnes lors de l'affichage des instructions d'un moniteur de performance

Il faut cliquez sur "Colonnes"


et choisir ces deux colonnes

qui affichent

Si on lance Visual Explain, auquel on demande les suggestions proposées


Vous pouvez retrouver le source de ces procédures via System i Navigator (elles sont livrées "tel que") et les personnaliser.



ET le level 13 (SF99601 level 24 en V6) en propose une autre :



QSYS2.Reset_Table_Index_Statistics

Paramètres
1) Schema - varchar(128)
 Nom de la bibliothèque

2) Table - varchar(128)
 Nom de la table ou du fichier physique

Ces deux paramètres sont sensibles à la casse et acceptent les caractères '_' et '%' (comme un LIKE)

Les compteur remis à zéro, sont ceux affichés ici


La procédure remet à zéro Query use count et Query statistic use mais n'impacte pas Last query use, ni Last query statistic use.


Mais aussi, nous avons maintenant (SF99701, level 18) des statistiques d'Entrée/Sortie globales (si la notion de collecte est démarrée)

Avec Navigator Director :

Entrée/sortie base de donnée physiques, vue détaillée

Par travail :

Par sous-système

Par type de serveur


 

• la PTF SI46631 implémente une nouvelle fonction XMLTABLE produisant un contenu SQL à partir d'un flux XML

Exemple, Soit la table CUSTOMER

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

Avec les données suivantes

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

Affiche

....+....1....+....2....+....3....+....4....+....5....+....6....+....7
NOM RUE VILLE
Kathy Smith 5 Rosewood Toronto
Jim Noodle 1150 Maple Drive Newtown
Robert Shoemaker 1596 Baseline Aurora
******** Fin de données ********

Si nous avions inséré les données de la manière suivante
INSERT INTO Customer (Cid, Info) VALUES (1000,        
'<customerinfo xmlns="http://posample.org" Cid="1000">
<name>Kathy Smith</name>
<addr country="Canada">
<street>5 Rosewood</street>
<city>Toronto</city>
<prov-state>Ontario</prov-state>
<pcode-zip>M6W 1E6</pcode-zip>
</addr>
<phone type="work">416-555-1358</phone>
</customerinfo>') INSERT INTO Customer (Cid, Info) VALUES (1002,
'<customerinfo xmlns="http://posample.org" Cid="1002">
<name>Jim Noodle</name>
<addr country="Canada">
<street>25 EastCreek</street>
<city>Markham</city>
<prov-state>Ontario</prov-state>
<pcode-zip>N9C 3T6</pcode-zip>
</addr>
<phone type="work">905-555-7258</phone>
</customerinfo>') INSERT INTO Customer (Cid, Info) VALUES (1003,
'<customerinfo xmlns="http://posample.org" Cid="1003">
<name>Robert Shoemaker</name>
<addr country="Canada">
<street>1596 Baseline</street>
<city>Aurora</city>
<prov-state>Ontario</prov-state>
<pcode-zip>N8X 7F8</pcode-zip>
</addr>
<phone type="work">905-555-2937</phone>
</customerinfo>')

les éléments XML sont alors réputés comme appartenant à un espace de nommage (namespace)

le choix d'un élément se fait en indiquant l'espace de nommage ou * (tous) suivit de ":"

Il faut alors écrire :

 SELECT X.NOM, X.RUE, X.VILLE 
 FROM Customer,   
    XMLTABLE ('$c/*:customerinfo' passing INFO as "c"
      COLUMNS  
       NOM     CHAR(30)    PATH '*:name',
       RUE		VARCHAR(25) PATH '*:addr/*:street',
       VILLE   VARCHAR(25) PATH '*:addr/*:city' ) AS X 
Ou bien définir l'espace de nommage
 SELECT X.nom ,x.rue, x.ville, x.pays 
  FROM posample/Customer,                           
 XMLTABLE (                                         
  XMLNAMESPACES('http://posample.org' as "cli"),     
   '$c/cli:customerinfo' passing INFO as "c"               
     COLUMNS                                        
      NOM    CHAR(30)    PATH 'cli:name',             
      RUE    VARCHAR(25) PATH 'cli:addr/cli:street',          
      VILLE  VARCHAR(25) PATH 'cli:addr/cli:city',       
      PAYS   char(30)    PATH 'cli:addr/@country'          
  ) AS X        

Vous remarquerez le choix d'un attribut "@country"

Ou bien encore, définir un espace de nommage par défaut

 SELECT X.nom ,x.rue, x.ville, x.pays 
  FROM posample/Customer,                           
 XMLTABLE (                                         
  XMLNAMESPACES(DEFAULT 'http://posample.org'),     
   '$c/customerinfo' passing INFO as "c"               
     COLUMNS                                        
      NOM    CHAR(30)    PATH 'name',             
      RUE    VARCHAR(25) PATH 'addr/street',          
      VILLE  VARCHAR(25) PATH 'addr/city',       
      PAYS   char(30)    PATH 'addr/@country'          
  ) AS X                                            



Vous remarquerez la syntaxe XPATH déjà utilisée avec OmniFind et maintenant documentée sur Information Center

la PTF SF99701, level 23 apporte de nouvelles fonctions orientées web services qui se marient très bien avec XMLTABLE

le but de ces fonctions est de consommer des services web plutôt orientés RESTful


Regardons à travers des exemples

Values SYSTOOLS.HTTPGETCLOB('http://www.volubis.fr' ,'') ;
  


Récupère dans une variable le contenu de notre page d'accueil


Le premier paramètre est de type VARCHAR(2048) et représente une URL

Le deuxième paramètre est de type CLOB(10K) et représente l'entête http


La valeur retour est la réponse fournie par le serveur (ce que vous aurait affiché votre navigateur)


Si le site retourne du XML, l'utilisation de la fonction XMLTABLE permettera de ne recevoir que les données utiles

Ici, le site www.redbooks.ibm.com propose des flux RSS donnant les publications récentes


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 données de manière structurée :


Ce code permet de lire le fichier cours.xml, s'il est disponible via HTTP

SELECT cours, texte, motcle1,  monthname(modif) concat '-' concat year(modif)
 FROM XMLTABLE('$result/AF400/COURS' 
  PASSING XMLPARSE( 
  DOCUMENT 
   SYSTOOLS.HTTPGETBLOB('http://as400.volubis.intra/af4dir/courshtm/XML/cours.xml','')
 ) as "result"
 COLUMNS 
  cours CHAR(10) PATH 'AF4MBR',
  texte CHAR(50) PATH 'AF4TXT',
  motcle1 VARCHAR(20) PATH 'MOTCL1',
  MODIF DATE PATH 'DATOUT'
 ) AS TABLEXML;  

Ce code permet de le lire via HTTP, la page étant protégée par un mot de passe

-- LECTURE fichier XML via INTERNET avec authentification
SELECT cours, texte, motcle1, monthname(modif) concat '-' concat year(modif)
FROM XMLTABLE('$result/AF400/COURS'
PASSING XMLPARSE(
DOCUMENT
SYSTOOLS.HTTPGETBLOB('http://af400:motdepasse@as400.volubis.fr/af4dir/courshtm/XML/cours.xml','')
) as "result"
COLUMNS
cours CHAR(10) PATH 'AF4MBR',
texte CHAR(50) PATH 'AF4TXT',
motcle1 VARCHAR(20) PATH 'MOTCL1',
MODIF DATE PATH 'DATOUT'
) AS TABLEXML;

Vous pouvez aussi passer l'authentification dans les entêtes :

  • Profil et mot de passe séparés par ":" (comme dans notre exemple) en UTF-8
  • puis encodé en Base64 (voir la fonction base64ENCODE)
  • enfin précédé du mot "basic"
<header name="Authorization" value="Basic bmljazpwYXNzdzByZA=="/>



httpGetBlobVerbose
httpGetClobVerbose
httpPutBlobVerbose
httpPutClobVerbose
httpPostBlobVerbose
httpPostClobVerbose
httpDeleteBlobVerbose
httpDeleteClobVerbose
httpBlobVerbose
httpClobVerbose
httpHeadVerbose


Plus d'exemples sur le cours SQLXML complet



• SI46876 permet d'insérer des données venant d'une base de données remote

Il est possible depuis la V7 d'utiliser une base "remote" de manière implicite

plutôt que d'écrire

	connect to AUTREAS
	select * from mabib.matable

Ecrivez

	select * from AUTREAS.mabib.matable

la connexion doit être avec authentification automatique, c'est à dire		
 qu'il faut avoir enregistré les paramètres d'authentification à l'avance par :

ADDSVRAUTE USPRF(*CURRENT) SERVER(AUTREAS) USERID(profil-distant) PASSWORD(motdepasse-distant)


Vous pourrez maintenant écrire (par exemple)

INSERT INTO GESCOM.VENTES
           (SELECT * FROM AUTREAS.GESCOM.VENTES WHERE DATEHA = CURRENT DATE - 1 DAY)


D'ailleurs, IBM fournit deux procédures dans SYSTOOLS utilisant cette fonctionnalité

Encore une fois, ces routines sont fournies à titre d'exemple et peuvent être modifiées

 

• La commande CPYTOIMPF a été modifiée afin d'autoriser un critère de tri (SF99701 level 14, SF99601 level 25)

Rappel, vous pouviez déjà créer une vue dans QTEMP et copier depuis cette vue, afin de réaliser :


Mais une vue n'acceptant pas de critère de tri (Order BY), nous étions bloqués jusqu'ici.

.

 

•Les commandes CPYTOIMPF/CPYFRMIMPF ont été modifiées afin de gérer les entêtes de colonne (SF99701 level 16)

 

Copy To Import File (CPYTOIMPF) – nouveau paramètre ADDCOLNAM


Copy From Import File (CPYFRMIMPF) – nouveau paramètre RMVCOLNAM


   Derniers groupes PTF (2013)

 

SF99701, level 21

• Nouvelle fonction SQL_CHECK_AUTHORITY (voir ci-dessus)

• Nouvelles procédures de comparaison de deux machines (voir ci-dessus)

SF99701, level 23

 

• Attention la PTF SF99701 level 22 est déclarée en erreur, ne l'installez pas, installez le level 23 à la place ou la SI49730

• Vous trouverez : un certain nombre de fonctions vues et procédures (voir ci-dessus)

 

• Des fonctions Http pour consommer des services web

 

• le support de STRQMQRY par STRDBMON

 

• La commande RGZPFM a été modifiée afin d'autoriser un critère de reprise

Nouveau Paramètre FROMRCD

  • *START , comme aujourd'hui
  • *PRVRGZ, repart de la dernière réorganisation incomplète
    (cas d'ajouts de lignes pendant le RGZPFM)

    ==> ALWCANCEL(*YES)
  • un-chiffre, permet de démarrer la réorganisation à une ligne donnée

 

• Au même niveau, la création d'objets avec des noms longs admet maintenant

FOR SYSTEM NAME permettant d'indiquer un nom système (avant il fallait renommer)

• La création de triggers SQL admet plusieurs événements

CREATE TRIGGER PERSOTRG
AFTER INSERT OR DELETE OR UPDATE OF SALAIRE ON PERSONP1
REFERENCING NEW AS N OLD AS O FOR EACH ROW
BEGIN
 IF INSERTING
  THEN UPDATE COMPANY_STATS SET NBREMP = NBREMP + 1;
 END IF;
 IF DELETING
  THEN UPDATE COMPANY_STATS SET NBREMP = NBREMP - 1;
 END IF;
 IF UPDATING AND (N.SALAIRE > 1.1 * O.SALAIRE)
  THEN SIGNAL SQLSTATE '75000'
  SET MESSAGE_TEXT = 'Salaire augmenté de plus de 10%'
 END IF;
END

 

• Structure de la table SYSIXADV suite à ce correctif :

nom de la colonne (zone) nom système Type de donnée Description
TABLE_NAME TBNAME VARCHAR(258) Table sur laquelle l'index est suggéré
TABLE_SCHEMA DBNAME CHAR(128) Schéma de la table
SYSTEM_TABLE_NAME SYS_TNAME CHAR(10) nom système (court) de la table
PARTITION_NAME TBMEMBER CHAR(10) Partition
KEY_COLUMNS_ADVISED KEYSADV VARCHAR(16000) nom des clés suggérées
LEADING_COLUMN_KEYS LEADKEYS VARCHAR(16000) clé principale, dont le critère de tri (croissant/décroissant) n'importe pas.
INDEX_TYPE INDEX_TYPE CHAR(14) type d'index (normal ou EVI)
LAST_ADVISED LASTADV TIMESTAMP date/heure de suggestion
TIMES_ADVISED TIMESADV BIGINT nombre de fois la suggestion a été faite
ESTIMATED_CREATION_TIME ESTTIME INT nombre de secondes(estimées) pour la création
REASON_ADVISED REASON CHAR(2) Code raison (Sélection / tri ou groupage / les deux)
LOGICAL_PAGE_SIZE PAGESIZE INT taille des pages recommandée
MOST_EXPENSIVE_QUERY QUERYCOST INT temps d'exécution le plus long
AVERAGE_QUERY_ESTIMATE QUERYEST INT temps d'exécution moyen
TABLE_SIZE TABLE_SIZE BIGINT nombre de lignes dans la table (lors de la suggestion)
NLSS_TABLE_NAME NLSSNAME CHAR(10) Séquence de tri à utiliser
NLSS_TABLE_SCHEMA NLSSDBNAME CHAR(10) Bibliothèque de la séquence de tri
MTI_USED MTIUSED BIGINT Nombre de fois ou cet MTI a été utilisé
(le système n'utilise plus un MTI, dès qu'un index permanent existe)
MTI_CREATED MTICREATED INT Nombre de fois ou cet MTI a été créé
(rappel un index MTI disparaît à l'IPL)
LAST_MTI_USED LASTMTIUSE TIMESTAMP Date/heure de dernière utilisation de cet index MTI.
AVERAGE_QUERY_ESTIMATE _MICRO QRYMICRO BIGINT temps moyen d'exécution de la requête à l'origine de cette suggestion
EVI_DISTINCT_VALUES EVIVALS INTEGER Nombre de valeurs distinctes pour création index EVI
INCLUDE_COLUMNS INCLCOL CLOB(10000) INCLUDE pour création index EVI
FIRST_ADVISED FIRSTADV TIMESTAMP Première suggestion
SYSTEM_TABLE_SCHEMA SYS_DNAME CHAR(10) Nom système de la bibliothèque
MTI_USED_FOR_STATS * MTISTATS BIGINT Nbr de fois, Index MTI utilisé pour des statistiques
LAST_MTI_USED_FOR_STATS * LASTMTISTA TIMESTAMP dernière utilisation Index MTI pour des statistiques
DEPENDENT_ADVICE_COUNT ** DEPCNT CHAR(10) Nombre de dépendances d'index (traitement de OR)

* SF99701, level 14 : les index MTI peuvent être utilisés pour collecter des performances

** SF99701, level 23 : les index proposés sont liés et utilisables par la même requête contenant des OR
si cette zone est différente de 0.

Exemple :

select * from vins
       where vin_cepage1 = 'Cabernet'
          or vin_cepage2 = 'Cabernet'
          or vin_cepage3 = 'Cabernet'

Contenu de SYSIXADV

INDEX_TYPE DEPENDENT_ADVICE_COUNT KEY_COLUMNS_ADVISED
----------- --------------------- -------------------
RADIX 1 VIN_CEPAGE1
RADIX 1 VIN_CEPAGE3
RADIX 1 VIN_CEPAGE2

 

 

SF99701, level 24

 

• La taille maxi d'un index passe de 1 To à 1,7 To

• Nouvelle procédure stockée OVERRIDE_TABLE( ) dans QSYS2 pour indiquer une taille de groupage

 

•Paramètre REFFLD renseigné lors de l'utilisation de CREATE TABLE (SI50058)


Enfin les derniers services pack de Client Access (SI47412) proposent une visualisation des postes de journaux

 

->

L'affichage se présente comme un affichage de moniteur de performances


SF99701, level 26 : nouveautés SQL de la TR7

 

les nouveautés SQL apportées par la PTF SF99701 niveau 26

• SQL as a service

But : fournir des informations systèmes dans un contexte SQL

Nouveautés

la vue USER_INFO donnant des informations sur les utilisateurs




FUNCTION_INFO affiche la liste des fonctions utilisées par WRKFCNUSG ou Administration d'applications



FUNCTION_USAGE donne la liste des droits par fonction



SYSTEM_VALUE_INFO est une vue retournant le contenu des valeurs système (numériques ou caractères)



USER_STORAGE affiche la mémoire maxi autorisée et la mémoire utilisée, par utilisateur

à ce propos la PTF SI42845 (V7) fait qu'un job ayant dépassé la CPU maxi ou la mémoire temporaire maxi est maintenant holdé !
(avant il était arrêté) avec envoi de message à QSYSOPR : CPI112D (CPU) et CPI112E (mémoire)

Nouvelles colonnes sur la fonction DISPLAY_JOURNAL()


Enfin la procédure QCMDEXC peut être appelée avec un seul paramètre (la commande à exécuter)


Liste récapitulative :

DB2 for i Service
Type Service
IBM i 7.1
IBM i 6.1
PTF
QSYS2.PTF_INFO Vue DSPPTF SF99701 Level 23 SF99601 Level 29
QSYS2.GROUP_PTF_INFO Vue WRKPTFGRP SF99701 Level 6 SF99601 Level 19
Sécurité
QSYS2.USER_INFO Vue RTVUSRPRF SF99701 Level 26 SF99601 Level 31
QSYS2.FUNCTION_INFO Vue WRKFCNUSG SF99701 Level 26 SF99601 Level 31
QSYS2.FUNCTION_USAGE Vue WRKFCNUSG par profil SF99701 Level 26 SF99601 Level 31
QSYS2.GROUP_PROFILE_ENTRIES Vue DSPUSRPRF TYPE(*GRPMBR) SF99701 Level 23 SF99601 Level 29
QSYS2.SQL_CHECK_AUTHORITY() UDF CHKOBJ AUT(*USE ) SF99701 Level 21 SF99601 Level 29
QSYS2.SET_COLUMN_ATTRIBUTE() Procédure droit de voir la colonne dans un moniteur de base SF99601 Level 8
Gestion des travaux
QSYS2.SYSTEM_VALUE_INFO Vue RTVSYSVAL SF99701 Level 26 SF99601 Level 31
QSYS2.GET_JOB_INFO() UDTF RTVJOBA/DSPJOB SF99701 Level 23 SF99601 Level 29
TCP/IP
SYSIBMADM.ENV_SYS_INFO Vue informations système SF99701 Level 23 SF99601 Level 29
QSYS2.TCPIP_INFO Vue informations TCP/IP SF99701 Level 6 SF99601 Level 19
Stockage
QSYS2.USER_STORAGE Vue DSPUSRPRF / mémoire utilisée SF99701 Level 26 SF99601 Level 31
QSYS2.SYSDISKSTAT Vue WRKDSKSTS SF99701 Level 12 SF99601 Level 21
Objets
QSYS2.OBJECT_STATISTICS() UDTF DSPOBJD SF99701 Level 3 SF99601 Level 16
Limites du système
QSYS2.SYSLIMTBL Table Alertes sur événements base de données
(voir OnDemand Tracking ci dessous)
SF99701 Level 23
Amélioration en :
SF99701 Level 26
SF99601 Level 29
Amélioration en :
SF99601 Level 31
QSYS2.SYSLIMITS Vue basé sur SYSLMTTBL ,
complété par des infos système
SF99701 Level 23
Amélioration en :
SF99701 Level 26
SF99601 Level 29
Amélioration en :
SF99601 Level 31
Journal
QSYS2.DISPLAY_JOURNAL() UDTF DSPJRN

de base
Amélioration en :
SF99701 Level 26

SF99601 Level 15
Amélioration en :
SF99601 Level 31

Exécution de commande
QSYS2.QCMDEXC() Procédure Exécution de commande de base
Amélioration en :
SF99701 Level 26
SF99601 Level 15
Amélioration en :
 SF99601 Level 3


• OnDemand Tracking System Limits

But du jeu, fournir des alertes sur les événements base de données pouvant impacter les limites du système, plutôt que de subir un arrêt de traitement ou des lenteurs


IBM indique les limites physiques de l'OS dans ce document : http://pic.dhe.ibm.com/infocenter/iseries/v7r1m0/topic/rzamp/rzamp.pdf

     les limites DB2 sont aussi fournies dans le fichier du catalogue SQL_SIZING

La mise en place de la phase 1 du projet est arrivée avec SF99601 level 26 (V6) ou SF99701 level 23 (V7)

   Il s'agissait de définir des seuils d'alerte par fonction

 

  A ces fonctions pouvant présenter une limite, on va associer :

les fonctions de la phase 1 (Level 23)

    les dépassements de seuils sont notifiés dans un fichier système : SYSLIMTBL

Cette gestion des événements est assurée par des travaux à très faible priorité (QDBSRVxx)

les fonctions ajoutées en phase 2 (level 26)


une vue est proposée SYSLIMITS faisant le lien entre SYSLIMTBL, SQL_SIZING et avec la fonction table GET_JOB_INFO()

Il a un système nettoyage automatique (PRUNE) sur SYSLMTTBL

 

Contrairement aux autres vues du catalogue SQL, vous pouvez associer à SYSLMTTBL un trigger (AFTER INSERT et/ou AFTER DELETE)

Définition de SYSLMTTBL


Dans le même temps System i Navigator propose une visualisation de la vue SYSLIMITS

dans le centre de santé

Onglet System Limits



Il faut commencer par définir des critères (bouton modification)





Le lien étant fait avec SQL_SIZING on peut vous indiquer si ce seuil est proche des limites du système ou pas.

Limites objets :

Limites travaux :


Instructions composées dynamiques
(Dynamic compound statement)

cela permet de placer une série d'instructions SQL PSM (PL/SQL) hors programme (dans un contexte interprété)

 un programme est généré à la volée dans QTEMP.

Exemples :

Ce source peut désormais être lancé par RUNSQLSTM
**************  Début des données  ***************************
CREATE TABLE QTEMP/CAVMAX (CUMUL DEC(10 , 2) , QUAND DATE) ; 
BEGIN 
 DECLARE CUMUL DEC(10 , 2); 
 SELECT SUM(CAV_PRIX) INTO CUMUL FROM BDVIN1/MA_CAVE; 
 IF (CUMUL > 100) THEN 
   INSERT INTO CAVMAX VALUES(CUMUL, CURRENT DATE) WITH NC; 
 END IF; 
END; 
***************  Fin des données  ****************************
ou par System i Navigator
Ce source de type CLP a été compilé et s'éxécute correctement
PGM 
 CHKOBJ QTEMP/CAVMAX *FILE 
  MONMSG CPF9801 EXEC(  + 
           RUNSQL ('CREATE TABLE QTEMP/CAVMAX (CUMUL DEC(10 , 2) , + 
                                               QUAND DATE)') ) 
 RUNSQL SQL('                                                      + 
  BEGIN                                                            + 
   DECLARE CUMUL DEC(10 , 2);                                      + 
   SELECT SUM(CAV_PRIX) INTO CUMUL FROM BDVIN1/MA_CAVE;            + 
   IF (CUMUL > 100) THEN                                           + 
    INSERT INTO CAVMAX VALUES(CUMUL, CURRENT DATE);                + 
   END IF;                                                         + 
  END                                                              + 
 ') COMMIT(*NONE) 
ENDPGM 

Remarques

 

• Pour une procédure, un trigger ou une fonction écrit en PL/SQL, vous pouvez désormais debuger au niveau SQL
(et non au niveau du C généré), avec SET OPTION DBGVIEW = *SOURCE



Pour voir les variables, Il faut simplement avoir mis un label au niveau du pgm et demander LABEL.VARIABLE (en majuscules)

ici TRT.CUMUL

• Le nouveau paramètre de la V7 DFRID permet de restaurer un physique APRES le(les) logiques ou Tables matérialisées (MQT).

Ceci est une fonction de base de la V7

Le level 26 des PTF Database permet d'appliquer ce mode fonctionnement (évitant une double restauration) aux journaux :

Il est possible désormais de restaurer des fichiers, des DataArea et des DTAQ, puis de restaurer le journal (objets dans BIBA, journal dans BIBJ)

les objets sont automatiquement journalisés dès que le journal est restauré.

Comme avec les logiques


• Il est possible d'utiliser une dénomination en trois partie sur un ordre SQL(voir plus haut)

plutôt que d'écrire

	connect to AUTREAS
	select * from mabib.matable

Ecrivez

	select * from AUTREAS.mabib.matable

Cette syntaxe s'applique désormais aussi aux ALIAS


Et l'Alias peut être modifié dynamiquement :

CHGRDBDIRE RDB(I5TEST AUTREAS) RMTLOCNAME(i5test.volubis.intra' *IP)
INSERT INTO
GESCOM.VENTES (SELECT * FROM AUTREAS.GESCOM.VENTES WHERE DATEHA = CURRENT DATE - 1 DAY)

CHGRDBDIRE RDB(I5PROD AUTREAS) RMTLOCNAME(i5prod.volubis.intra' *IP)
INSERT INTO
GESCOM.VENTES (SELECT * FROM AUTREAS.GESCOM.VENTES WHERE DATEHA = CURRENT DATE - 1 DAY)


• Les fichiers du catalogues système de gestion des droits , soit :

SYSCOLAUTH Droits sur les colonnes
SYSPACKAGEAUTH Droits sur les *SQLPKG
SYSROUTINEAUTH Droits sur les procédures/fonctions
SYSSCHEMAAUTH Droits sur les bibliothèques
SYSSEQUENCEAUTH Droits sur les séquences
SYSTABAUTH Droits sur les tables
SYSUDTAUTH Droits sur les fonctions Tables
SYSVARIABLEAUTH * Droit sur les variables globales (*SRVPGM)
SYSXSROBJECTAUTH * Droits sur les schémas XML (*XSROBJ)
  * V7 Uniquement  

Possèdent maintenant une nouvelle colonne AUTHORIZATION_LIST (liste d'autorisation)


Si cette colonne est à NULL, les droits affichés viennent de l'objet, sinon de cette liste d'autorisation


• Deux nouvelles informations liées aux propriétés du cache des plans d'accès

Visible via System i Navigator mais aussi par QSYS2.DUMP_PLAN_CACHE_PROPERTIES()



Elles correspondent aux plans liés à des tables déclarées GLOBAL TEMPORARY TABLE (dans QTEMP)

Les PTF MF57716,MF57717,MF57718 et SI51455 (plus SI50567 coté client) , fournissent en plus :



• Le déplacement en temps réel des objets Database sur disque SSD, ne pouvait se faire que lorsque les objets n'étaient plus utilisés
(CHGPF UNIT(*SSD) ou ALTER TABLE UNIT SSD)

   Désormais cela sera compatible avec un verrouillage *SHRRD ou *SHRUPD, rendant l'opération plus souple.

• Nouvelles informations affichées par system i Navigator

Sur un moniteur de performances, l'affichage de la vue "program summary"


Affiche des informations détaillées par programme :



ces quatre colonnes concernant les I/O disques, sont nouvelles

Dans l'arborescence "Maintenance base de données", l'option construction d'index, vous indique

• Nouvelles fonctions de modernisation de la base

Option de génération d'index supplémentaire , choix Génération de vue vs index.

Soit les fichiers physiques et logiques suivants :

Clientp1 Cdeentp1 Cdedetp1

R CLIENTF1 TEXT('FICHIER CLIENT') NOCLI 6 0 TEXT('N° CLIENT') NOMCLI 30 TEXT('NOM CLIENT') ADR1 35 TEXT('ADRESSE') ADR2 30 TEXT('ADRESSE') DEPCLI 2S 0 TEXT('DEPART') BDIS 3S 0 TEXT('B DIST') DATCRT L COLHDG('DATCRT')
R CDEENTF1                  TEXT('FICHIER COMMANDES'
  NOCDE          6  0       TEXT('N° CDE') 
  NOCLI          6  0       TEXT('N° CLIENT') 
  DATCDE          L         TEXT('DATE CDE') 
  DATLIV          L         TEXT('DATE LIV') 
R CDEDETF1                  TEXT('FICHIER L COMMANDES')
  NOCDE          6  0       TEXT('N° CDE') 
  NOLIG          3  0       TEXT('N° LIGNE') 
  CODART        10          TEXT('CODE ARTICLE') 
  QTECDE         7  2       TEXT('QTE CDE') 
Clientl1 (logique simple)    
R CLIENTF1                  PFILE(CLIENTP1) 
K NOMCLI 
   
Clientl2 (redéfinition de format + sélection/omission)    
R CLIENTF2                  PFILE(CLIENTP1) 
NOMCLI
ADR1
ADR2
DEPCLI
BDIS
K NOMCLI
S DEPCLI COMP(EQ 44)
   
  ClientJF (fichier logique joint)  
                 
R CLIENTJF                  JFILE(CLIENTP1 CDEENTP1 +
                                  CDEDETP1) 
J                           JOIN(1 2) 
                            JFLD(NOCLI NOCLI) 
J                           JOIN(2 3) 
                            JFLD(NOCDE NOCDE) 
 NOMCLI 
 DEPCLI 
 BDIS 
 DATCDE 
 DATLIV 
 CODART 
 QTECDE 
K NOMCLI 
 

L'option de génération SQL "standard",


génère le code suivant (essentiellement des vues SQL) :

CREATE TABLE FORMATION1/CLIENTP1 ( 
 NOCLI DECIMAL(6, 0) NOT NULL DEFAULT 0 , 
 NOMCLI CHAR(30) CCSID 297 NOT NULL DEFAULT '' , 
 ADR1 CHAR(35) CCSID 297 NOT NULL DEFAULT '' , 
 ADR2 CHAR(30) CCSID 297 NOT NULL DEFAULT '' , 
 DEPCLI NUMERIC(2, 0) NOT NULL DEFAULT 0 , 
 BDIS NUMERIC(3, 0) NOT NULL DEFAULT 0 , 
 DATCRT DATE NOT NULL DEFAULT CURRENT_DATE ) 
RCDFMT CLIENTF1   ; 
 
CREATE VIEW FORMATION1/CLIENTL1 ( 
--  SQL1506   30   Clé ou attribut ignoré pour CLIENTL1 de FORMATION1. 
 NOCLI ,  NOMCLI , ADR1 ,  ADR2 , DEPCLI , BDIS ,  DATCRT ) 
 AS 
 SELECT  NOCLI , NOMCLI , ADR1 , ADR2 , DEPCLI , BDIS , DATCRT 
 FROM FORMATION1/CLIENTP1 
RCDFMT CLIENTF1   ; 

CREATE VIEW FORMATION1/CLIENTL2 ( 
--  SQL1506   30   Clé ou attribut ignoré pour CLIENTL2 de FORMATION1. 
 NOMCLI ,  ADR1 , ADR2 , DEPCLI ,  BDIS ) 
 AS 
 SELECT  NOMCLI , ADR1 , ADR2 , DEPCLI , BDIS 
 FROM FORMATION1/CLIENTP1 
WHERE DEPCLI = +44 RCDFMT CLIENTF2 ; CREATE VIEW FORMATION1/CLIENTJF ( -- SQL1506 30 Clé ou attribut ignoré pour CLIENTJF de FORMATION1. NOMCLI , DEPCLI , BDIS , DATCDE , DATLIV , CODART , QTECDE ) AS SELECT Q01.NOMCLI , Q01.DEPCLI , Q01.BDIS , Q02.DATCDE , Q02.DATLIV , Q03.CODART , Q03.QTECDE FROM FORMATION1/CLIENTP1 AS Q01 INNER JOIN FORMATION1/CDEENTP1 AS Q02 ON ( Q01.NOCLI = Q02.NOCLI ) INNER JOIN FORMATION1/CDEDETP1 AS Q03 ON ( Q02.NOCDE = Q03.NOCDE )
RCDFMT CLIENTJF ;


En cochant Generate additionnal Indexes, cela ajoute les index implicitement créés dans les logiques

--suite à CREATE VIEW FORMATION1/CLIENTL1 ../...
CREATE INDEX FORMATION1/CLIENTL1_QSQGNDDL_00001 
ON FORMATION1/CLIENTP1 ( NOMCLI ASC ) ;

--suite à CREATE VIEW FORMATION1/CLIENTL2 ../...
CREATE INDEX FORMATION1/CLIENTL2_QSQGNDDL_00001
ON FORMATION1/CLIENTP1 ( NOMCLI ASC )
WHERE DEPCLI = +44 ; ; --enfin suite à CREATE VIEW FORMATION1/CLIENTJF ../...
CREATE INDEX FORMATION1/CLIENTJF_QSQGNDDL_00001 ON FORMATION1/CLIENTP1 ( NOMCLI ASC ) ; CREATE INDEX FORMATION1/CLIENTJF_QSQGNDDL_00002 ON FORMATION1/CDEENTP1 ( NOCLI ASC ) ; CREATE INDEX FORMATION1/CLIENTJF_QSQGNDDL_00003 ON FORMATION1/CDEDETP1 ( NOCDE ASC ) ;



En cochant Generate index instead of view (exclusive de l'option précédente)

--CREATE INDEX CLIENTL1 à la place de vue
CREATE INDEX FORMATION1/CLIENTL1 
ON FORMATION1/CLIENTP1 ( NOMCLI ASC )
RCDFMT CLIENTF1 ;

--CREATE INDEX CLIENTL2 à la place de vue, on perd la liste des zones
CREATE INDEX FORMATION1/CLIENTL2
-- SQL1507 20 Nbre tables dépendantes, spécifs sélect/omiss. ou format ignoré pour CLIENTL2 de FORMATION1.
ON FORMATION1/CLIENTP1 ( NOMCLI ASC )
WHERE DEPCLI = +44 ;
-- CLIENTJF reste une vue
CREATE VIEW FORMATION1/CLIENTJF ( -- SQL1507 20 Nbre tables dépendantes, spécifs sélect/omiss. ou format ignoré pour CLIENTJF de FORMATION1. NOMCLI , DEPCLI , BDIS , DATCDE , DATLIV , CODART , QTECDE ) AS SELECT Q01.NOMCLI , Q01.DEPCLI , Q01.BDIS , Q02.DATCDE , Q02.DATLIV , Q03.CODART , Q03.QTECDE FROM FORMATION1/CLIENTP1 AS Q01 INNER JOIN FORMATION1/CDEENTP1 AS Q02 ON ( Q01.NOCLI = Q02.NOCLI ) INNER JOIN FORMATION1/CDEDETP1 AS Q03 ON ( Q02.NOCDE = Q03.NOCDE )
RCDFMT CLIENTJF ;


Comme la fonction DISPLAY_JOURNAL() a été modifiée, de nouvelles colonnes sont proposées à l'affichage du contenu d'un journal (F12)
System i Navigator -> Navigator for I (version Web) ->



• Navigator for I

La PTF SI48982 propose une nouvelle procédure pour OmniFind lors de l'indexation de fichiers de l'IFS : ADD_IFS_STMF_OBJECT_SET_WITH_SUBDIR

permettant lors de l'ajout d'un répertoire à un Index OmniFind, d'ajouter automatiquement les sous répertoires

Cette option se retrouve dans Navigator for i (SF99368 Level 22 minimum)





L'option Create collection propose un interface à la procédure SYSTS_CRTCOL


L'option Collection List, liste les index OmniFind créés par SYSTS_CRTCOL
, properties permettant une maintenance des objets indexés

->

Enfin Search permet une recherche dans l'index


Résultat


SF99701, level 29 : nouveautés SQL de la TR8

 

les nouveautés SQL apportées par la PTF SF99701 niveau 29 (Juin 2014)

• GENERATE_SQL() permet d'obtenir le source SQL d'un élément base de données dans un membre source, par procédure
   (ceci correspond à l'option de system i Navigator "génération d'instruction SQL" )

• DELIMIT_NAME() génère les délimiteurs (" et ') quand c'est nécessaire pour un nom de table

DELIMIT_NAME('test"name') -> "test""name

• EXTRACT_STATEMENT retourne des informations sur le contenu d'une image instantanée du cache des plans d'accès

    (générée par System i Navigator ou QSYS2.DUMP_PLAN_CACHE)


QSYS2.DUMP_PLAN_CACHE_topN, génère une image instantanée avec les plans des N instructions les plus consommatrices

CALL QSYS2.DUMP_PLAN_CACHE_topN(’MABIB’, ’TOPN20’, 20);
-- génère une image instantanée nommée TOPN20 dans MABIB, avec les 20 instructions ayant le temps de traitement cumulé le plus long


RESTART_IDENTITY() permet pour une table dupliquée d'avoir comme prochaine valeur d'un champ AS IDENTITY la même que la table d'origine


Deux nouvelles tables du catalogue SQL pour les ordres SQL « Embeded »

SysPackageStmtStat, contient une ligne par instruction contenue dans un *SQLPKG

SysProgramStmtStat, contient une ligne par instruction contenue dans un programme (*PGM)


SQE possède, désormais, la faculté de détecter les instructions SQL complexes exécutées en parallèle.

   Dans ce cas, il ne fabrique pas de plus de 3 plans concurremment et attends plutôt la production des plans en cours avant de lancer la requête...


Nous avons vu que les registres clients (Client ProgramID, Client APPLNAME, etc...) sont désormais aussi renseignés pour :

Ils le seront aussi en Level 29 pour DDM/DRDA

La fonction table GET_JOB_INFO du level 23 a été modifiée

L'ordre de recherche des authentificaitons enregistrée pour DDM/DRDA (ADDSVRAUTE) change

Enfin le correctif de fin Mai sur Client Access, doit apporter à System i Navigator


Copyright © 2013/2014 VOLUBIS