s11 modernisation db2 des dds sql
Post on 12-Jan-2016
61 Views
Preview:
DESCRIPTION
TRANSCRIPT
GAIA 2011
IBM i
La modernisation de la Base de Données DB2 for iPassage 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
IBM i
GAIA 20112
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
IBM i
GAIA 20113
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…
IBM i
GAIA 20114
KNOW 400 : DISPOSITIF DE CAPITALISATION
BASE DE CONNAISSANCES WEB
WWW.KNOW400.FR
IBM i
GAIA 20115
KNOW 400 : DISPOSITIF DE CAPITALISATION
BASE DE CONNAISSANCES IBM i– RPG IV, ILE, Web Services, SQL…
– Exploitation,Système…
– CONTENUS THEMATIQUES
– BASE D’EXERCICES ET D’EXEMPLES
– PARCOURS FORMATION
– SERVICES ASSOCIES– Tutorat, formation online, conseil online
WWW.KNOW400. FR
GAIA 2011
IBM i
DB2 for i
Comprendre les différences entre fichier natif et SQL
6
IBM i
GAIA 2011
Vers SQL
Historiquement
– IBM i (système 38, 36, AS400, iSeries, 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
IBM i
GAIA 2011
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
IBM i
GAIA 2011
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
IBM i
GAIA 2011
Structured Query Language
10
IBM i
GAIA 2011
Structured Query Language
SQL est composé de plusieurs langages, chacun dédié à une utilisation
– DML (Data Manipulation language)
– Permet de sélectionner, insérer, 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, c’est-à-dire les tables, les index et
les contraintes
– DCL (Data Control Language)
– Gestion des autorisations, au niveau des objets comme au niveau colonne
– PL/SQL (Procedural Language)
– Langage de programmation SQL pour les SGBD : procédures stockées, fonctions
utilisateurs, triggers
– SQL embarqué
– DML, DDL, DCL et des éléments de PL/SQL disponibles pour les langages de
programmation
11
IBM i
GAIA 2011
SQL sur IBM i
Particularité DB2 for i
– Intégré à l’OS
– Gestion d’équivalent avec DB2 natif
– De multiples interfaces
– SQL Interactif (STRSQL)
– Exécution de scripts SQL (RUNSQLSTM)
– SQL embarqué
– Query Manager (QM)
– SQL interactif par iSeries Navigator
12
IBM i
GAIA 2011
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, ce qui signifie que toutes les évolutions porte
sur SQL
Pour des raisons techniques
– Performances
– Fiabilité des données
– Simplicité de développement
13
IBM i
GAIA 2011
DB2 for i
Vocabulaire et concepts
14
IBM i DB2 for i
Bibliothèque Schéma, 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
IBM i
GAIA 2011
DB2 for i
Une différence fondamentale
15
PF (DDS)
TABLE (SQL)
WRITE INSERT
READ FETCH
CONTROLE
CONTROLE
Et ?
30 %
70 %
IBM i
GAIA 2011
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
IBM i
GAIA 2011
DB2 for i
Bibliothèque vs Schema/Collection
– Catalogue
17
QSYS
QSYS2
COLLECTION
(*LIB)
LIBRABRY
(*LIB)
SYSTABLES
QADBXREF
SYSTABLES
CREATE COLLECTION CRTLIB
IBM i
GAIA 2011
DB2 for i
Principales vues du catalogue
Nom Usage
SYSCOLUMNS Colonnes des tables et index
SYSCHKCST
SYSCST
SYSCSTCOL
SYSCSTDEP
SYSREFCST
Contraintes de clés, d’intégrité, de vérification
SYSINDEXES Index
SYSKEYS
SYSKEYCSTClés
SYSTABLES Tables et index
SYSVIEWS Vues
IBM i
GAIA 2011
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
IBM i
GAIA 2011
Et plus !
SQL apporte d’autres fonctionnalités
– Intégrité référentielle
– Triggers
– Plus de possibilités avec SQL
– Droits au niveau colonne
– XML
– Index EVI
– LOB
– Encryption
– …
20
GAIA 2011
IBM i
Migration des structures
« Compatibilité ascendante » signifie que toutes les erreurs de
conception originelles sont conservées
21
IBM i
GAIA 2011
Problématique
Le problème n’est pas tant de créer les tables qui vont
remplacer nos fichiers physiques, 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
IBM i
GAIA 2011
Principe PF -> TABLE
23
PF FIC1
A R FIC1FMT
A ID 10S 0 TEXT('Clé')
A DONNEES 20A TEXT('Données')
A SELE 10A TEXT('Sélection')
A K ID
TABLE FIC1
CREATE TABLE FIC1 (
ID NUMERIC(10, 0) NOT NULL DEFAULT 0 ,
DONNEES CHAR(20) NOT NULL DEFAULT '' ,
SELE CHAR(10) NOT NULL DEFAULT '' ,
PRIMARY KEY( ID ) ) ;
LABEL ON TABLE FIC1
IS 'Libellé FIC1' ;
LABEL ON COLUMN FIC1 (
ID TEXT IS 'Clé' ,
DONNEES TEXT IS 'Données' ,
SELE TEXT IS 'Sélection' ) ;
IBM i
GAIA 2011
Principe LF -> INDEX
24
PF FIC1L0
A R FIC1FMT PFILE(FIC1)
A K ID
INDEX FIC1L0
CREATE INDEX FIC1L0 ON FIC1 ( ID ) ;
LABEL ON INDEX FIC1L0
IS 'Clé non unique' ;
IBM i
GAIA 2011
Principe LF -> INDEX dérivé
25
PF FIC1L1
A R FIC1FMT PFILE(FIC1)
A K ID
A S SELE COMP(EQ 'OUI')
INDEX FIC1L1
CREATE INDEX FIC1L1 ON FIC1 ( ID )
WHERE SELE = 'OUI'
ADD ALL COLUMNS ;
LABEL ON INDEX FIC1L0
IS 'Clé non unique' ;
IBM i
GAIA 2011
Principe LF -> VUE
26
PF FIC13V0
A R F13FTM JFILE(FIC1 FIC3)
A J JOIN(FIC1 FIC3)
A JFLD(ID CLE)
A ID
A CLE
A DONNEES
Vue FIC13V0
CREATE VIEW FIC13V0 (
ID , CLE , DONNEES )
AS
SELECT f1.ID , f2.CLE , f1.DONNEES
FROM FIC1 AS f1
INNER JOIN FIC3 AS f2 ON ( f1.ID = f2.CLE ) ;
LABEL ON COLUMN FIC13V0
( ID TEXT IS 'Clé' ,
CLE TEXT IS 'Clé' ,
DONNEES TEXT IS 'Données' ) ;
IBM i
GAIA 2011
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
IBM i
GAIA 2011
Usages supportés et non supportés
TABLE INDEX INDEX
Dérivé
VUE
RPG (*)Carte F
Idem PF Idem LF Idem LF Idem LF
SQLEmbarqué
QMQRY
Interactif, …
Idem PF Non supporté Idem LF
CLOPNQRYF
Idem PF Idem LF Non supporté Idem LF
28
(*) Pour un même ID de niveau format entre le fichier DDS et le fichier SQL
IBM i
GAIA 2011
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
IBM i
GAIA 2011
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
IBM i
GAIA 2011
Concepts non supportés par SQL
Clé non unique sur un PF
– Pour un PF, 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
IBM i
GAIA 2011
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, DSPF)
– Une TABLE sert à stocker l’information
DATFMT, TIMFMT
– Même principe que EDTCDE
– Pour SQL, une date est une date
– *ISO
32
IBM i
GAIA 2011
Amélioration du support
Format et DATFMT/TIMFMT
– Pour des raisons de compatibilité, le mot-clé RCDFMT a été ajoutée
à SQL
– Il permet d’indiquer un format d’enregistrement sur une table, 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
IBM i
GAIA 2011
Amélioration du support
Format et DATFMT/TIMFMT
– Format
– Essentiel pour la compatibilité avec les programmes existants
– Calculé sur la base de
– Nom du format
– Nom des zones
– Type et longueur des zones
– Ordre des zones
34
IBM i
GAIA 2011
Amélioration du support
RCDFMT
– Table, vue et index
– Index dérivé
– A défaut de RCDFMT ou ADD ALL COLUMNS
– Ne contient que la clé
35
TABLE FIC2
CREATE TABLE FIC2 (
ID NUMERIC(10, 0) NOT NULL DEFAULT 0 ,
DONNEES CHAR(20) NOT NULL DEFAULT '' ,
SELE CHAR(10) NOT NULL DEFAULT '' ,
LASTUPD DATE NOT NULL DEFAULT CURRENT_DATE ,
PRIMARY KEY( ID ) )
RCDFMT FIC2FMT ;
INDEX FIC2L0
CREATE INDEX FIC2L0 ON FIC2 ( DONNEES )
RCDFMT FIC2FMT ;
IBM i
GAIA 2011
Concepts non supportés par SQL
TABLE INDEX INDEX
Dérivé
VUE
Clé non unique Non
supportéOui Non
supportéClé unique Oui
Multi-membres Non supporté
Multi-formats Non supporté
Date et heure
( <> *ISO)Oui (RCDFMT)
Date et heure
(Formats multiples)Non supporté
36
IBM i
GAIA 2011
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
IBM i
GAIA 2011
Analyse d’impacts
Lister dans votre application, les fichiers
38
Impact
fort
• Multi-membres, multi-formats
• PF avec clé non unique
Impact
faible
• EDTCDE
• DATFMT et TIMFMT <> *ISO
• OPNQRYF (utilisation d’index dérivé)
• SQL (utilisation de LF)
Sans
impact
• Les autres fichiers
IBM i
GAIA 2011
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
-- Liste des fichiers multi-membres
select mblib, mbfile, count( mbname ) as "Nombre de membres"
from nbonnet.mbr_recup
group by mblib, mbfile
having count(*) > 1
order by mblib, "Nombre de membres" desc ;
39
IBM i
GAIA 2011
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, mbfile, count( mbname )
from nbonnet.mbr_recup
group by mblib, mbfile
having count(*) = 1 )
select tous.mblib as "Bibliothèque" ,
tous.mbfile as "Fichier" ,
tous.mbname as "Membre"
from nbonnet.mbr_recup tous
join mono on tous.mblib = mono.mblib and
tous.mbfile = mono.mbfile
where tous.mbfile <> tous.mbname
order by tous.mblib, tous.mbfile ;
40
IBM i
GAIA 2011
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, count(*)
from nbonnet.fmt_recup
group by rflib, rffile
having count(*) <> 1
order by rflib, rffile ;
41
IBM i
GAIA 2011
Aide à l’analyse d’impact
Fichiers source
– Nécessairement multi-membre
– Pour les isoler
select *
from qsys2.systables
where file_type = 'S' and
system_table_schema = 'RECUP' ;
42
IBM i
GAIA 2011
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.key_recup
where apftyp = 'P' and -- on ne traite que les PF et les TABLE
apuniq = 'Y'
order by apfile ;
43
IBM i
GAIA 2011
Aide à l’analyse d’impact
EDTCDE, 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 <> '' ;
44
IBM i
GAIA 2011
Aide à l’analyse d’impact
– DATFMT <> *ISOselect whlib, whfile, whfldi, whfmt, whsep
from nbonnet.col_recup
where whfldt in ('L', 'T') and
whfmt <> '*ISO' ;
– DATFMT hétérogènes-- liste des zones de date et heure par fichier
with lstfmtdat as (
select whlib, whfile, count( distinct whfmt )
from nbonnet.col_nbdds a
where whfldt = 'L'
Having count(*) > 1
group by whlib, whfile
) ,
select tous.whlib, tous.whfile, tous.whfldi, tous.whfmt, tous.whsep
from nbonnet.col_nbdds tous
join lstfmtdat dat on tous.whlib = dat.whlib and tous.whfile =
dat.whfile
where whfldt = 'L'
order by whlib, whfile, whfldi ;
45
IBM i
GAIA 2011
Outils
Pour vous aider dans la réécriture des structures
– API QSQGNDDL (Generate Data Definition Language)
– http://publib.boulder.ibm.com/infocenter/iseries/v7r1m0/index.jsp?topic=/
apis/qsqgnddl.htm
– De façon plus simple
– System i Navigator
– Des commandes disponibles sur le net
– http://systeminetwork.com/article/retrieving-sql-definitions-dds-files (Bob
Cozzi)
– http://jplamontre.free.fr/AS400/RTVSQL.htm
– Possibilité d’automatiser dans des CL
46
IBM i
GAIA 2011
System i Navigator
47
IBM i
GAIA 2011
System i Navigator
48
IBM i
GAIA 2011
System i Navigator
49
IBM i
GAIA 2011
System i Navigator
50
IBM i
GAIA 2011
System i Navigator
51
IBM i
GAIA 2011
System i Navigator
52
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
IBM i
GAIA 2011
System i Navigator
53
Permet l’utilisation de commandes CL
– Un script SQL peut enchainer tout ce dont vous avez besoin !
GAIA 2011
IBM i
Migration des données
Ou comment apprendre que mes données sont incorrectes
54
IBM i
GAIA 2011
Problématique
55
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, 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
IBM i
GAIA 2011
Problématique
56
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
IBM i
GAIA 2011
Itération
ENVIRONNEMENT DE REPRISEPRODUCTION
Problématique
57
DDSDDSCOPIE
SQL Anomalies
Extraction des anomalies
Extraction des
enregistrements valides
Contrôle des types de données
Corrections
cumulées
IBM i
GAIA 2011
Techniques de reprise
58
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
IBM i
GAIA 2011
RPG – carte F 1/2
59
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 )
// DS pour lectures/écritures
d ptr_enr s * inz( %addr( enr_in ) )
d enr_in ds likerec( fmtin : *input )
d enr_out ds likerec( fmtout : *output )
d based( ptr_enr )
d enr_ano ds likerec( fmtano : *output )
d based( ptr_enr )
d enreg_banal s 50a based( ptr_enr )
// DS pour contrôle des zones
d enregCtl e ds extname( 'REPRISE/ARTICLE' )
d qualified
// indicateur d'erreur
d Lbln_Err s n inz( *off )
IBM i
GAIA 2011
RPG – carte F 2/2
60
// boucle de lecture
dow not %eof( article ) ;
// Lecture du fichier
read fmtin enr_in ;
if %eof( article ) ;
// sortir de la boucle de traitement
leave ;
endif ;
// test de l'enregistrement
monitor ;
eval-corr enregCtl = enr_in ;
LBln_Err = *off ;
on-error ;
LBln_Err = *on ;
endmon ;
if not LBln_Err ;
// traitement enregistrement OK
write fmtout enr_out ;
else ;
// traitement enregistrement KO
monitor ;
write fmtano enr_ano ;
on-error ;
dsply 'Anomalie non gérable. Début de l''enreg :' ;
dsply enreg_banal ;
endmon;
endif ;
enddo ;
IBM i
GAIA 2011
RPG – SQL 1/3
61
h dftactgrp( *no ) actgrp( *new ) datfmt( *iso ) timfmt( *iso )
// DS pour lectures/écritures
d ptr_enr s * inz( %addr( enr_in ) )
d enr_in e ds extname( 'REPRISE/ARTICLE' )
d qualified
d enr_out e ds extname( 'REPRISE/ART_SQL' )
d based( ptr_enr )
d qualified
// DS pour contrôle des zones
d enregCtl e ds extname( 'REPRISE/ARTICLE' )
d qualified
// indicateur d'erreur
d Lbln_Err s n inz( *off )
// Gestion des erreurs
d Err_nb s 10i 0 inz
d Err_msgid s 7a inz
d Err_msgtxt s 256a inz
d Err_sqlstate s 6a inz
d Err_Cpt s 10i 0 inz
d Msg s 52a inz
IBM i
GAIA 2011
RPG – SQL 2/3
62
// options SQL
exec sql set option datfmt = *iso ,
commit=*none ,
naming = *sys ;
// déclaration du curseur SQL pour lecture du fichier
exec sql declare lect cursor for
select *
from reprise/article
for fetch only ;
exec sql open lect ;
dow sqlCode <> 100 ;
// lecture
exec sql fetch from lect into :enr_in ;
// test du SQLState
select ;
// 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. Cela nécessiterait
// une boucle ici
dsply ( 'SQLErm : ' + %subst( SQLErm : 1 : 40 ) ) ;
// nombre d'erreurs
exec sql get diagnostics :Err_nb = NUMBER ;
dsply ( 'Erreur (' + %char( Err_nb ) + ')' ) ;
IBM i
GAIA 2011
RPG – SQL 3/3
63
// récupérer les informations de chaque erreur
for Err_Cpt = 1 to Err_nb ;
// récupérer l'ID de msg, le texte et le sqlstate
exec sql get diagnostics condition :Err_cpt
:Err_msgid = DB2_MESSAGE_ID ,
:Err_msgtxt = MESSAGE_TEXT ,
:Err_sqlstate = RETURNED_SQLSTATE ;
dsply ( 'Err. ' + %char( Err_Cpt ) +
' -MsgId: ' + Err_msgid +
' -SqlState: ' + Err_sqlstate ) ;
dsply %subst( Err_msgtxt : 1 : 50 ) ;
endfor ;
// Pas de données
when %subst( SqlState : 1 : 2 ) >= '02' ;
leave ;
// Avertissements
when %subst( SqlState : 1 : 2 ) = '01' ;
dsply 'Avertissement' ;
// Sinon
Other ;
// insertion de l'enregistrement
exec sql insert into reprise/art_sql
values ( :enr_in ) ;
endsl ;
enddo ;
GAIA 2011
IBM i
MERCI
64
top related