64
GAIA 2011 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 BONNETGAIA Mini Systèmes [email protected]

S11 Modernisation DB2 Des DDS SQL

Embed Size (px)

DESCRIPTION

S11 Modernisation DB2 Des DDS SQL

Citation preview

Page 1: S11 Modernisation DB2 Des DDS SQL

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 – [email protected]

Page 2: S11 Modernisation DB2 Des DDS SQL

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

Page 3: S11 Modernisation DB2 Des DDS SQL

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…

Page 4: S11 Modernisation DB2 Des DDS SQL

IBM i

GAIA 20114

KNOW 400 : DISPOSITIF DE CAPITALISATION

BASE DE CONNAISSANCES WEB

WWW.KNOW400.FR

Page 5: S11 Modernisation DB2 Des DDS SQL

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

Page 6: S11 Modernisation DB2 Des DDS SQL

GAIA 2011

IBM i

DB2 for i

Comprendre les différences entre fichier natif et SQL

6

Page 7: S11 Modernisation DB2 Des DDS SQL

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

Page 8: S11 Modernisation DB2 Des DDS SQL

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

Page 9: S11 Modernisation DB2 Des DDS SQL

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

Page 10: S11 Modernisation DB2 Des DDS SQL

IBM i

GAIA 2011

Structured Query Language

10

Page 11: S11 Modernisation DB2 Des DDS SQL

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

Page 12: S11 Modernisation DB2 Des DDS SQL

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

Page 13: S11 Modernisation DB2 Des DDS SQL

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

Page 14: S11 Modernisation DB2 Des DDS SQL

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

Page 15: S11 Modernisation DB2 Des DDS SQL

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 %

Page 16: S11 Modernisation DB2 Des DDS SQL

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

Page 17: S11 Modernisation DB2 Des DDS SQL

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

Page 18: S11 Modernisation DB2 Des DDS SQL

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

Page 19: S11 Modernisation DB2 Des DDS SQL

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

Page 20: S11 Modernisation DB2 Des DDS SQL

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

Page 21: S11 Modernisation DB2 Des DDS SQL

GAIA 2011

IBM i

Migration des structures

« Compatibilité ascendante » signifie que toutes les erreurs de

conception originelles sont conservées

21

Page 22: S11 Modernisation DB2 Des DDS SQL

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

Page 23: S11 Modernisation DB2 Des DDS SQL

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' ) ;

Page 24: S11 Modernisation DB2 Des DDS SQL

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' ;

Page 25: S11 Modernisation DB2 Des DDS SQL

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' ;

Page 26: S11 Modernisation DB2 Des DDS SQL

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' ) ;

Page 27: S11 Modernisation DB2 Des DDS SQL

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

Page 28: S11 Modernisation DB2 Des DDS SQL

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

Page 29: S11 Modernisation DB2 Des DDS 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

Page 30: S11 Modernisation DB2 Des DDS SQL

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

Page 31: S11 Modernisation DB2 Des DDS SQL

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

Page 32: S11 Modernisation DB2 Des DDS SQL

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

Page 33: S11 Modernisation DB2 Des DDS SQL

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

Page 34: S11 Modernisation DB2 Des DDS SQL

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

Page 35: S11 Modernisation DB2 Des DDS SQL

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 ;

Page 36: S11 Modernisation DB2 Des DDS SQL

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

Page 37: S11 Modernisation DB2 Des DDS SQL

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

Page 38: S11 Modernisation DB2 Des DDS SQL

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

Page 39: S11 Modernisation DB2 Des DDS SQL

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

Page 40: S11 Modernisation DB2 Des DDS SQL

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

Page 41: S11 Modernisation DB2 Des DDS SQL

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

Page 42: S11 Modernisation DB2 Des DDS SQL

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

Page 43: S11 Modernisation DB2 Des DDS SQL

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

Page 44: S11 Modernisation DB2 Des DDS SQL

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

Page 45: S11 Modernisation DB2 Des DDS SQL

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

Page 47: S11 Modernisation DB2 Des DDS SQL

IBM i

GAIA 2011

System i Navigator

47

Page 48: S11 Modernisation DB2 Des DDS SQL

IBM i

GAIA 2011

System i Navigator

48

Page 49: S11 Modernisation DB2 Des DDS SQL

IBM i

GAIA 2011

System i Navigator

49

Page 50: S11 Modernisation DB2 Des DDS SQL

IBM i

GAIA 2011

System i Navigator

50

Page 51: S11 Modernisation DB2 Des DDS SQL

IBM i

GAIA 2011

System i Navigator

51

Page 52: S11 Modernisation DB2 Des DDS SQL

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

Page 53: S11 Modernisation DB2 Des DDS SQL

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 !

Page 54: S11 Modernisation DB2 Des DDS SQL

GAIA 2011

IBM i

Migration des données

Ou comment apprendre que mes données sont incorrectes

54

Page 55: S11 Modernisation DB2 Des DDS SQL

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

Page 56: S11 Modernisation DB2 Des DDS SQL

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

Page 57: S11 Modernisation DB2 Des DDS SQL

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

Page 58: S11 Modernisation DB2 Des DDS SQL

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

Page 59: S11 Modernisation DB2 Des DDS SQL

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 )

Page 60: S11 Modernisation DB2 Des DDS SQL

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 ;

Page 61: S11 Modernisation DB2 Des DDS SQL

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

Page 62: S11 Modernisation DB2 Des DDS SQL

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 ) + ')' ) ;

Page 63: S11 Modernisation DB2 Des DDS SQL

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 ;

Page 64: S11 Modernisation DB2 Des DDS SQL

GAIA 2011

IBM i

MERCI

64