You are on page 1of 64

IBM i

La modernisation de la Base de Données DB2 for i
Passage de DDS à SQL
16 et 17 mai 2011 – IBM Forum de Bois-Colombes
Session 11 – Mardi 17 mai – 09h00/10h30
Nathanaël BONNET– GAIA Mini Systèmes – nbonnet@gaia.fr

GAIA 2011

IBM i

AGENDA

Profitez de données plus fiables et plus
accessibles grâce à SQL
–Comprendre les différences entre DB2 natif
et DB2 SQL
–Comment migrer vos structures de fichiers
tout en limitant les impacts sur votre
existant
–Les difficultés de la migration de données :
données non conformes et volumétrie

2

GAIA 2011

IBM i

GAIA : EXPERTISE CONSEIL ET FORMATION DEPUIS 1999
 NOS DOMAINES DE COMPETENCES



IBM i
Lotus Domino
Java / Websphere
Technologies Web

 EXPERTISES
– Système
– Migration, optimisation…

– Développement
– Méthodologie, conseil, assistance technique…

– Accompagnement
– Conduite du changement, support aux équipes…

3

GAIA 2011

IBM i KNOW 400 : DISPOSITIF DE CAPITALISATION  BASE DE CONNAISSANCES WEB WWW.KNOW400.FR 4 GAIA 2011 .

ILE. conseil online WWW.IBM i KNOW 400 : DISPOSITIF DE CAPITALISATION  BASE DE CONNAISSANCES IBM i – RPG IV. SQL… – Exploitation. FR 5 GAIA 2011 . Web Services.Système… – CONTENUS THEMATIQUES – BASE D’EXERCICES ET D’EXEMPLES – PARCOURS FORMATION – SERVICES ASSOCIES – Tutorat. formation online.KNOW400.

IBM i DB2 for i Comprendre les différences entre fichier natif et SQL GAIA 2011 6 .

System i …) Système de fichier QSYS Structures de fichiers propriétaires Langage propriétaire – DDS  Evolution de la plateforme – Support de SQL – Famille DB2  Particularité IBM i – DB2 est intégré à l’OS – Equivalence gérée par l’OS entre fichier natif DDS et SQL 7 GAIA 2011 . iSeries. 36. AS400.IBM i Vers SQL  Historiquement – – – – IBM i (système 38.

IBM i

Structured Query Language
 Le langage standard de manipulation de données

 Présent dans tous les SGBD
– Mais non portable d’un SGBD a un autre
– Chaque éditeur « enrichissant » le standard de sa propre syntaxe ou
fonctionnalité

 Langage ensembliste
– Manipule un ensemble de données
– De 0 à n enregistrements

– Contrairement à RPG
– Enregistrement par enregistrement

 La première version commerciale
– 1979
8

GAIA 2011

IBM i

Structured Query Language
 C’est le langage incontournable sur toutes les plateformes

 Sur IBM i
– De nombreuses évolutions au fil des ans
– IBM a stabilisé le DDS, seul SQL évolue
– Nouveaux types de donnée
– Nouvelles fonctionnalités

9

GAIA 2011

IBM i

Structured Query Language

10

GAIA 2011

supprimer ou modifier des données dans une table (des tables) d’une base de données relationnelle – DDL (Data Definition Language) – Permet de définir les structures de données.IBM i Structured Query Language  SQL est composé de plusieurs langages. DCL et des éléments de PL/SQL disponibles pour les langages de programmation 11 GAIA 2011 . chacun dédié à une utilisation – DML (Data Manipulation language) – Permet de sélectionner. les index et les contraintes – DCL (Data Control Language) – Gestion des autorisations. c’est-à-dire les tables. insérer. fonctions utilisateurs. DDL. triggers – SQL embarqué – DML. au niveau des objets comme au niveau colonne – PL/SQL (Procedural Language) – Langage de programmation SQL pour les SGBD : procédures stockées.

IBM i SQL sur IBM i  Particularité DB2 for i – Intégré à l’OS – Gestion d’équivalent avec DB2 natif – De multiples interfaces – – – – – 12 SQL Interactif (STRSQL) Exécution de scripts SQL (RUNSQLSTM) SQL embarqué Query Manager (QM) SQL interactif par iSeries Navigator GAIA 2011 .

ce qui signifie que toutes les évolutions porte sur SQL  Pour des raisons techniques – Performances – Fiabilité des données – Simplicité de développement 13 GAIA 2011 .IBM i Mais pourquoi passer de DDS à SQL ?  Pour des raisons humaines – Il est simple de trouver une compétence SQL – Moins simple pour DDS  Pour des raisons de politique de développement – RoadMap IBM – IBM a « stabilisé » DDS.

Collection ou BD Fichier physique Table Enregistrement Ligne Champ Colonne Logique à clé Index Logique sans clé Vue Format Membre Nom = 10 caractères Nom = 128 caractères Catalogue Journalisation Journalisation Intégrité référentielle 14 GAIA 2011 .IBM i DB2 for i  Vocabulaire et concepts IBM i DB2 for i Bibliothèque Schéma.

IBM i DB2 for i  Une différence fondamentale 30 % WRITE INSERT CONTROLE PF (DDS) Et ? CONTROLE READ 15 TABLE (SQL) 70 % FETCH GAIA 2011 .

IBM i DB2 for i  Une autre différence – DDS = compilation – SQL = exécution script – Objets par défaut dans *CURLIB  Impacts – Développement – Objets – Livraison – Différentiel – Script 16 GAIA 2011 .

IBM i DB2 for i  Bibliothèque vs Schema/Collection – Catalogue QSYS QADBXREF QSYS2 SYSTABLES COLLECTION (*LIB) CREATE COLLECTION 17 SYSTABLES LIBRABRY (*LIB) CRTLIB GAIA 2011 .

de vérification SYSINDEXES Index SYSKEYS SYSKEYCST Clés SYSTABLES Tables et index SYSVIEWS Vues GAIA 2011 . d’intégrité.IBM i DB2 for i  Principales vues du catalogue Nom Usage SYSCOLUMNS Colonnes des tables et index SYSCHKCST SYSCST SYSCSTCOL SYSCSTDEP SYSREFCST Contraintes de clés.

IBM i DB2 for i  Journalisation – SQL – Par défaut – Une journal et un récepteur de journal associé sont créés automatiquement dans la collection – QSQJRN (*JRN) – QSQJRN0001 (*JRNRCV) – Toute table créée dans une collection est journalisée – Toute table créée dans une bibliothèque n’est pas journalisée – DDS – Manuelle – Aucun fichier n’est journalisé 19 GAIA 2011 .

IBM i Et plus !  SQL apporte d’autres fonctionnalités – Intégrité référentielle – Triggers – Plus de possibilités avec SQL – – – – – – 20 Droits au niveau colonne XML Index EVI LOB Encryption … GAIA 2011 .

IBM i Migration des structures « Compatibilité ascendante » signifie que toutes les erreurs de conception originelles sont conservées GAIA 2011 21 .

mais plutôt de maitriser tous les impacts  Nous allons donc – Etudier ces différences dans le détail – Dresser la liste des usages qui posent problèmes  Avec ce guide – Analyse d’impact de notre existant – Prévoir les modifications – De fichiers – De programmes 22 GAIA 2011 .IBM i Problématique  Le problème n’est pas tant de créer les tables qui vont remplacer nos fichiers physiques.

SELE CHAR(10) NOT NULL DEFAULT '' .IBM i Principe PF -> TABLE PF FIC1 A A A A A R FIC1FMT ID DONNEES SELE K ID 10S 0 20A 10A TEXT('Clé') TEXT('Données') TEXT('Sélection') TABLE FIC1 CREATE TABLE FIC1 ( ID NUMERIC(10. 0) NOT NULL DEFAULT 0 . 23 GAIA 2011 . LABEL ON TABLE FIC1 IS 'Libellé FIC1' . PRIMARY KEY( ID ) ) . SELE TEXT IS 'Sélection' ) . LABEL ON COLUMN FIC1 ( ID TEXT IS 'Clé' . DONNEES CHAR(20) NOT NULL DEFAULT '' . DONNEES TEXT IS 'Données' .

24 GAIA 2011 . LABEL ON INDEX FIC1L0 IS 'Clé non unique' .IBM i Principe LF -> INDEX PF FIC1L0 A A R FIC1FMT K ID PFILE(FIC1) INDEX FIC1L0 CREATE INDEX FIC1L0 ON FIC1 ( ID ) .

LABEL ON INDEX FIC1L0 IS 'Clé non unique' . 25 GAIA 2011 .IBM i Principe LF -> INDEX dérivé PF FIC1L1 A A A R FIC1FMT K ID S SELE PFILE(FIC1) COMP(EQ 'OUI') INDEX FIC1L1 CREATE INDEX FIC1L1 ON FIC1 ( ID ) WHERE SELE = 'OUI' ADD ALL COLUMNS .

CLE . LABEL ON COLUMN FIC13V0 ( ID TEXT IS 'Clé' .IBM i Principe LF -> VUE PF FIC13V0 A A A A A A R F13FTM J JFILE(FIC1 FIC3) JOIN(FIC1 FIC3) JFLD(ID CLE) ID CLE DONNEES Vue FIC13V0 CREATE VIEW FIC13V0 ( ID . CLE . f2. CLE TEXT IS 'Clé' .DONNEES FROM FIC1 AS f1 INNER JOIN FIC3 AS f2 ON ( f1.CLE ) .ID . f1.ID = f2. DONNEES ) AS SELECT f1. DONNEES TEXT IS 'Données' ) . 26 GAIA 2011 .

IBM i Usages supportés et non supportés  Types d’usage – RPG (carte F) – SQL – Sous toutes ces formes – SQL embarqué – QMQRY – SQL interactif. RUNSQLSTM … – CL – Les commandes relatives aux fichiers DDS – OPNQRY. … 27 GAIA 2011 .

IBM i Usages supportés et non supportés RPG (*) Carte F TABLE INDEX INDEX Dérivé VUE Idem PF Idem LF Idem LF Idem LF SQL Embarqué QMQRY Interactif. … CL OPNQRYF Idem PF Idem PF Non supporté Idem LF Non supporté Idem LF Idem LF (*) Pour un même ID de niveau format entre le fichier DDS et le fichier SQL 28 GAIA 2011 .

IBM i Usages non supportés  Modifications à apporter – RPG – En cas de modification du niveau de format – Recompilation – SQL – Réécrire les requêtes qui utilisent des LF – Utiliser les tables et les vues – CL (OPNQRYF) – Réécrire les QRY qui utilisent des LF convertis en index dérivés – Utiliser les tables. index ou vue 29 GAIA 2011 .

IBM i Concepts non supportés par SQL  Format – La notion de format n’existe pas en SQL – Par défaut – nom du format = nom de la table – Un unique format possible  Membre – La notion de membre n’existe pas en SQL – Par défaut – nom du membre = nom de la table – Un unique membre possible – CHGPF MAXMBRS(*NOMAX) provoque un CPD3213 « Nombre maximal de membres incorrect pour le fichier … » 30 GAIA 2011 .

les cas suivants sont possibles – Pas de clé – Ordre physique – Clé non unique – Tri – Clé unique – Identifiant – Pour une TABLE – Pas de clé – Ne devrait pas arriver – Ordre physique – Clé primaire ou clé unique – Identifiant 31 GAIA 2011 .IBM i Concepts non supportés par SQL  Clé non unique sur un PF – Pour un PF.

DSPF) – Une TABLE sert à stocker l’information  DATFMT.IBM i Concepts non supportés par SQL  EDTCDE – Les codes éditions ne sont pas supportés par SQL – Les codes éditions sont utiles dans les IHM (PRTF. une date est une date – *ISO 32 GAIA 2011 . TIMFMT – Même principe que EDTCDE – Pour SQL.

un index ou une vue – Pris en compte dans l’ID de niveau de format – Lorsque RCDFMT est présent – Le format des zones DATE et TIME est indiqué par l’option DATFMT de RUNSQLSTM – *JOB par défaut – Toutes les zones date sont au même format 33 GAIA 2011 . le mot-clé RCDFMT a été ajoutée à SQL – Il permet d’indiquer un format d’enregistrement sur une table.IBM i Amélioration du support  Format et DATFMT/TIMFMT – Pour des raisons de compatibilité.

IBM i Amélioration du support  Format et DATFMT/TIMFMT – Format – Essentiel pour la compatibilité avec les programmes existants – Calculé sur la base de – – – – 34 Nom du format Nom des zones Type et longueur des zones Ordre des zones GAIA 2011 .

– Index dérivé – A défaut de RCDFMT ou ADD ALL COLUMNS – Ne contient que la clé 35 GAIA 2011 . '' . vue et index TABLE FIC2 CREATE TABLE FIC2 ( ID NUMERIC(10. INDEX FIC2L0 CREATE INDEX FIC2L0 ON FIC2 ( DONNEES ) RCDFMT FIC2FMT . CURRENT_DATE . '' . 0 .IBM i Amélioration du support  RCDFMT – Table. 0) NOT NULL DEFAULT DONNEES CHAR(20) NOT NULL DEFAULT SELE CHAR(10) NOT NULL DEFAULT LASTUPD DATE NOT NULL DEFAULT PRIMARY KEY( ID ) ) RCDFMT FIC2FMT .

IBM i Concepts non supportés par SQL TABLE Clé non unique Clé unique 36 INDEX Non supporté INDEX Dérivé Oui Oui Multi-membres Non supporté Multi-formats Non supporté Date et heure ( <> *ISO) Oui (RCDFMT) Date et heure (Formats multiples) Non supporté VUE Non supporté GAIA 2011 .

IBM i DB2 for i  Réutilisation d’enregistrements supprimés (REUSEDLT) – Par défaut – SQL = *YES – DDS = *NO – Nécessite RGZPFM – Allocation exclusive du fichier 37 GAIA 2011 .

multi-formats • PF avec clé non unique • EDTCDE • DATFMT et TIMFMT <> *ISO • OPNQRYF (utilisation d’index dérivé) • SQL (utilisation de LF) • Les autres fichiers GAIA 2011 .IBM i Analyse d’impacts  Lister dans votre application. les fichiers Impact fort Impact faible Sans impact 38 • Multi-membres.

IBM i Aide à l’analyse d’impact  Fichiers multi-membres – Les membres ne sont pas détaillés dans le catalogue – DSPFD FILE(RECUP/*ALL) TYPE(*MBR) OUTPUT(*OUTFILE) OUTFILE(NBONNET/MBR_RECUP) – Interrogation -. 39 GAIA 2011 . count( mbname ) as "Nombre de membres" from nbonnet. "Nombre de membres" desc . mbfile. mbfile having count(*) > 1 order by mblib.mbr_recup group by mblib.Liste des fichiers multi-membres select mblib.

mbname as "Membre" from nbonnet. tous. mbfile having count(*) = 1 ) select tous.mbfile = mono.mblib = mono. mbfile.mbfile <> tous. tous.mblib and tous.mbr_recup tous join mono on tous. tous. count( mbname ) from nbonnet. 40 GAIA 2011 .mbr_recup group by mblib.mbname order by tous.mbfile where tous.mbfile as "Fichier" .mbfile .mblib as "Bibliothèque" .mblib.IBM i Aide à l’analyse d’impact  Fichiers mono-membre – Dont le nom du membre est différent du nom de fichier – Purement informatif with mono as ( select mblib.

41 GAIA 2011 . count(*) from nbonnet.IBM i Aide à l’analyse d’impact  Fichiers multi-formats – Les formats ne sont pas détaillés dans le catalogue – DSPFD FILE(RECUP/*ALL) TYPE(*RCDFMT) OUTPUT(*OUTFILE) OUTFILE(NBONNET/FMT_RECUP) select rflib. rffile having count(*) <> 1 order by rflib.fmt_recup group by rflib. rffile . rffile.

42 GAIA 2011 .systables where file_type = 'S' and system_table_schema = 'RECUP' .IBM i Aide à l’analyse d’impact  Fichiers source – Nécessairement multi-membre – Pour les isoler select * from qsys2.

key_recup where apftyp = 'P' and -.on ne traite que les PF et les TABLE apuniq = 'Y' order by apfile . 43 GAIA 2011 .IBM i Aide à l’analyse d’impact  PF à clé non unique – Les clés des PF ne sont pas contenues dans le catalogue SQL – Seules les contraintes de clés sont cataloguées – DSPFD FILE(RECUP/*ALL) TYPE(*ACCPTH) OUTPUT(*OUTFILE) OUTFILE(NBONNET/KEY_RECUP) select aplib "Bibliothèque". apfile "Fichier" from nbonnet.

IBM i Aide à l’analyse d’impact  EDTCDE. 44 GAIA 2011 . DATFMT/TIMFMT – Les formats ne sont pas détaillés dans le catalogue – DSPFFD FILE(RECUP/*ALL) OUTPUT(*OUTFILE) OUTFILE(NBONNET/COL_RECUP) – EDTCDE select * from nbonnet.col_recup where whecde <> '' .

whlib = dat.whfmt.liste des zones de date et heure par fichier with lstfmtdat as ( select whlib.whlib and tous.whlib.whfile = dat. whfile. tous. whfile. count( distinct whfmt ) from nbonnet.whfile. – DATFMT hétérogènes -. whfile ) .whfile where whfldt = 'L' order by whlib. tous. 45 GAIA 2011 . tous.IBM i Aide à l’analyse d’impact – DATFMT <> *ISO select whlib.col_recup where whfldt in ('L'. 'T') and whfmt <> '*ISO' .col_nbdds tous join lstfmtdat dat on tous. whfile. select tous.whsep from nbonnet. tous.col_nbdds a where whfldt = 'L' Having count(*) > 1 group by whlib.whfldi. whsep from nbonnet. whfldi. whfldi . whfmt.

com/infocenter/iseries/v7r1m0/index.fr/AS400/RTVSQL.htm – Possibilité d’automatiser dans des CL 46 GAIA 2011 .boulder.com/article/retrieving-sql-definitions-dds-files (Bob Cozzi) – http://jplamontre.IBM i Outils  Pour vous aider dans la réécriture des structures – API QSQGNDDL (Generate Data Definition Language) – http://publib.jsp?topic=/ apis/qsqgnddl.ibm.free.htm – De façon plus simple – System i Navigator – Des commandes disponibles sur le net – http://systeminetwork.

IBM i System i Navigator 47 GAIA 2011 .

IBM i System i Navigator 48 GAIA 2011 .

IBM i System i Navigator 49 GAIA 2011 .

IBM i System i Navigator 50 GAIA 2011 .

IBM i System i Navigator 51 GAIA 2011 .

IBM i System i Navigator  PF -> TABLE – Pratique – Génère les scripts – Y compris les messages d’information pour ce qui n’est pas supporté – Reste à adapter – Nom de bibliothèque qualifiée à supprimer  LF -> INDEX – Génère des vues et non des index – A reprendre à la main – En fonction du volume de structures à reprendre – Il est possible de faire une commande – Analyse le LF ou interroge le catalogue – Génère le script SQL pour l’index 52 GAIA 2011 .

IBM i System i Navigator  Permet l’utilisation de commandes CL – Un script SQL peut enchainer tout ce dont vous avez besoin ! 53 GAIA 2011 .

IBM i Migration des données Ou comment apprendre que mes données sont incorrectes GAIA 2011 54 .

date … – Erreur lors de la lecture  Insertion des données dans les tables SQL – On ne va pouvoir reprendre les données corrompues – Il va donc falloir en faire quelque chose – C’est toute la difficulté – Et ce n’est pas technique 55 GAIA 2011 .IBM i Problématique  DDS – Les enregistrements ne sont contrôlés qu’à la lecture – Ce qui signifie que vous avez des données corrompues – Sur les zones alphanumériques – Cela ne se voit pas trop – Sur les zones numériques.

IBM i Problématique  Aspect technique – Identifier les données corrompues – Afin qu’elles soient traitées – Par des règles fonctionnelles à définir – Reprendre les données valides  Méthode – Itérative – L’arbre cache la forêt 56 GAIA 2011 .

IBM i Problématique  Itération PRODUCTION ENVIRONNEMENT DE REPRISE COPIE DDS DDS Contrôle des types de données Corrections cumulées Extraction des enregistrem ents valides Extraction des anomalies SQL 57 Anomalies GAIA 2011 .

IBM i Techniques de reprise  Problème – Manipuler des données incorrectes – Provoque des anomalies dans le code – Gérer les anomalies prévues – Ne pas gérer les autres anomalies  Quelles techniques utiliser – Commandes CL. SQL ? – RPG – Carte F – SQL  Avantage – Carte F – Permet de lire des valeurs erronées 58 GAIA 2011 .

IBM i RPG – carte F 1/2 h dftactgrp( *no ) actgrp( *new ) datfmt( *iso ) timfmt( *iso ) // fichier contenant les données à reprendre farticle if e k disk extfile( *EXTDESC ) f extdesc( 'REPRISE/ARTICLE' ) f rename( articlf : fmtin ) // fichier des données reprises .correctes fart_sql o e k disk extfile( *EXTDESC ) f extdesc( 'REPRISE/ART_SQL' ) f rename( articlf : fmtout ) // fichier des données en anomalies fart_ano o e k disk extfile( *EXTDESC ) f extdesc( 'REPRISE/ART_ANO' ) f rename( articlf : fmtano ) d d d d d d // DS pour lectures/écritures ptr_enr s enr_in ds enr_out ds enr_ano d enreg_banal * ds s 50a // DS pour contrôle des zones d enregCtl e ds d // indicateur d'erreur d Lbln_Err s 59 inz( %addr( enr_in ) ) likerec( fmtin : *input ) likerec( fmtout : *output ) based( ptr_enr ) likerec( fmtano : *output ) based( ptr_enr ) based( ptr_enr ) extname( 'REPRISE/ARTICLE' ) qualified n inz( *off ) GAIA 2011 .

// traitement enregistrement OK write fmtout enr_out . // Lecture du fichier read fmtin enr_in . 60 GAIA 2011 . dsply enreg_banal . endif . enddo . else . write fmtano enr_ano . on-error . LBln_Err = *on . endmon . if not LBln_Err . on-error .IBM i RPG – carte F 2/2 // boucle de lecture dow not %eof( article ) . Début de l''enreg :' . // test de l'enregistrement monitor . // sortir de la boucle de traitement leave . LBln_Err = *off . dsply 'Anomalie non gérable. if %eof( article ) . eval-corr enregCtl = enr_in . // traitement enregistrement KO monitor . endmon. endif .

IBM i RPG – SQL 1/3 h dftactgrp( *no ) actgrp( *new ) datfmt( *iso ) timfmt( *iso ) // DS pour lectures/écritures d ptr_enr s d enr_in e ds d d enr_out e ds d d * // DS pour contrôle des zones d enregCtl e ds d // indicateur d'erreur d Lbln_Err s d d d d d // Gestion des erreurs Err_nb s Err_msgid s Err_msgtxt s Err_sqlstate s Err_Cpt s d Msg 61 s inz( %addr( enr_in ) ) extname( 'REPRISE/ARTICLE' qualified extname( 'REPRISE/ART_SQL' based( ptr_enr ) qualified ) ) extname( 'REPRISE/ARTICLE' ) qualified n inz( *off ) 10i 0 inz 7a inz 256a inz 6a inz 10i 0 inz 52a inz GAIA 2011 .

naming = *sys . // Erreur // L'enregistrement n'a pas été lu // La DS enr_in a conservée son ancienne valeur when %subst( SqlState : 1 : 2 ) >= '03' . // Avant toute autre instruction SQL // SQLErm est une suite de valeur alpha varying. dow sqlCode <> 100 . // test du SQLState select . Cela nécessiterait // une boucle ici dsply ( 'SQLErm : ' + %subst( SQLErm : 1 : 40 ) ) . // déclaration du curseur SQL pour lecture du fichier exec sql declare lect cursor for select * from reprise/article for fetch only .IBM i RPG – SQL 2/3 // options SQL exec sql set option datfmt = *iso . // lecture exec sql fetch from lect into :enr_in . // nombre d'erreurs exec sql get diagnostics :Err_nb = NUMBER . commit=*none . exec sql open lect . 62 GAIA 2011 . dsply ( 'Erreur (' + %char( Err_nb ) + ')' ) .

endfor . // insertion de l'enregistrement exec sql insert into reprise/art_sql values ( :enr_in ) .IBM i RPG – SQL 3/3 // récupérer les informations de chaque erreur for Err_Cpt = 1 to Err_nb . // Sinon Other . // Avertissements when %subst( SqlState : 1 : 2 ) dsply 'Avertissement' . enddo . le texte et le sqlstate exec sql get diagnostics condition :Err_cpt :Err_msgid = DB2_MESSAGE_ID . endsl . dsply %subst( Err_msgtxt : 1 : 50 ) . :Err_msgtxt = MESSAGE_TEXT . dsply ( 'Err. // Pas de données when %subst( SqlState : 1 : 2 ) >= '02' . ' + %char( Err_Cpt ) + ' -MsgId: ' + Err_msgid + ' -SqlState: ' + Err_sqlstate ) . :Err_sqlstate = RETURNED_SQLSTATE . // récupérer l'ID de msg. = '01' . leave . 63 GAIA 2011 .

IBM i MERCI GAIA 2011 64 .