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
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 : 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
KNOW 400 : DISPOSITIF DE CAPITALISATION BASE DE CONNAISSANCES WEB WWW.KNOW400.FR 4
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 5
DB2 for i Comprendre les différences entre fichier natif et SQL 6
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
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
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
Structured Query Language 10
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
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
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
DB2 for i IBM i Vocabulaire et concepts IBM i Bibliothèque Fichier physique Enregistrement Champ Logique à clé Logique sans clé Format Membre Nom = 10 caractères Journalisation DB2 for i Schéma, Collection ou BD Table Ligne Colonne Index Vue Nom = 128 caractères Catalogue Journalisation Intégrité référentielle 14
DB2 for i IBM i Une différence fondamentale WRITE 30 % INSERT PF (DDS) CONTROLE Et? CONTROLE TABLE (SQL) READ 70 % FETCH 15
DB2 for i IBM 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
DB2 for i IBM i Bibliothèque vs Schema/Collection Catalogue QSYS QADBXREF QSYS2 SYSTABLES COLLECTION (*LIB) CREATE COLLECTION SYSTABLES LIBRABRY (*LIB) CRTLIB 17
DB2 for i IBM i Principales vues du catalogue Nom SYSCOLUMNS SYSCHKCST SYSCST SYSCSTCOL SYSCSTDEP SYSREFCST SYSINDEXES SYSKEYS SYSKEYCST SYSTABLES SYSVIEWS Usage Colonnes des tables et index Contraintes de clés, d intégrité, de vérification Index Clés Tables et index Vues
DB2 for i IBM 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
Et plus! IBM i 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
Migration des structures «Compatibilité ascendante» signifie que toutes les erreurs de conception originelles sont conservées 21
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
Principe PF -> TABLE 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' ) ; 23
Principe LF -> INDEX 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' ; 24
Principe LF -> INDEX dérivé 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' ; 25
Principe LF -> VUE 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' ) ; 26
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
Usages supportés et non supportés RPG (*) Carte F SQL Embarqué QMQRY Interactif, CL OPNQRYF TABLE INDEX INDEX Dérivé VUE Idem PF Idem LF Idem LF Idem LF Idem PF Non supporté Idem LF Idem PF Idem LF Non supporté Idem LF (*) Pour un même ID de niveau format entre le fichier DDS et le fichier SQL 28
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
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
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
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
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
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
Amélioration du support RCDFMT Table, vue et index 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 ; Index dérivé A défaut de RCDFMT ou ADD ALL COLUMNS Ne contient que la clé 35
Concepts non supportés par SQL Clé non unique Clé unique Multi-membres Multi-formats Date et heure ( <> *ISO) Date et heure (Formats multiples) TABLE INDEX INDEX Dérivé Non supporté Oui Oui Non supporté Non supporté Oui (RCDFMT) Non supporté VUE Non supporté 36
DB2 for i IBM i Réutilisation d enregistrements supprimés (REUSEDLT) Par défaut SQL = *YES DDS = *NO Nécessite RGZPFM Allocation exclusive du fichier 37
Analyse d impacts Lister dans votre application, les fichiers 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 38
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
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
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
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
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
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
Aide à l analyse d impact DATFMT <> *ISO select 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
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
System i Navigator 47
System i Navigator 48
System i Navigator 49
System i Navigator 50
System i Navigator 51
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
System i Navigator Permet l utilisation de commandes CL Un script SQL peut enchainer tout ce dont vous avez besoin! 53
Migration des données Ou comment apprendre que mes données sont incorrectes 54
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, 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
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
Problématique Itération PRODUCTION ENVIRONNEMENT DE REPRISE DDS COPIE DDS Contrôle des types de données Corrections cumulées Extraction des enregistrem ents valides Extraction des anomalies SQL Anomalies 57
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
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 ) // 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 ) 59
RPG carte F 2/2 // 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 ; 60
RPG SQL 1/3 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 61
RPG SQL 2/3 // 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 ) + ')' ) ; 62
RPG SQL 3/3 // 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 ; 63
MERCI 64