6e Christian Soutou édition SQL€¦ · SQL Oraclepour Applications avec Java, PHP et XML...

72
SQL pour Oracle Applications avec Java, PHP et XML Optimisation des requêtes et schémas Christian Soutou SQL pour Oracle Applications avec Java, PHP et XML Optimisation des requêtes et schémas 6 e édition 6 e édition Avec 50 exercices corrigés © Groupe Eyrolles, 2004, 2005, 2008, 2010, 2011, 2013, ISBN : 978-2-212-13673-9

Transcript of 6e Christian Soutou édition SQL€¦ · SQL Oraclepour Applications avec Java, PHP et XML...

  • SQLpour

    OracleApplications avec Java, PHP et XML

    Optimisation des requêtes et schémas

    Christian Soutou

    SQLpour

    OracleApplications avec Java, PHP et XML

    Optimisation des requêtes et schémas

    6 eédition

    6 eédition

    Avec 50 exercicescorrigés

    © Groupe Eyrolles, 2004, 2005, 2008, 2010, 2011, 2013, ISBN : 978-2-212-13673-9

  • © Éditions Eyrolles XI

    Table des matières

    Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1SQL, une norme, un succès . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1Modèle de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

    Tables et données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2Les clés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

    Oracle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3Un peu d’histoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4Rachat de Sun (et de MySQL) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5Offre du moment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6Notion de schéma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8Accès à Oracle depuis Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9Détail d’un numéro de version. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

    Installation d’Oracle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9Versions anciennes d’Oracle (de 9i à 10g) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10Mise en œuvre d’Oracle 11g . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10Désinstallation de la 11g . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14Mise en œuvre d’Oracle 11g XE Beta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

    Les interfaces SQL*Plus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16Généralités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16Premiers pas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23Variables d’environnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24À propos des accents et jeux de caractères . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

    Partie I SQL de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291 Définition des données. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

    Tables relationnelles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31Création d’une table (CREATE TABLE) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31Casse et commentaires. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32Premier exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33Contraintes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33Conventions recommandées. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35Types des colonnes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36Structure d’une table (DESC) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39Restrictions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40Commentaires stockés (COMMENT) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

    SOUTOU Livre Page XI Vendredi, 4. janvier 2013 3:09 15

  • SQL pour Oracle

    XII © Éditions Eyrolles

    Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41Classification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42Index B-tree. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42Index bitmap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42Index basés sur des fonctions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43Création d’un index (CREATE INDEX) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43Bilan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

    Tables organisées en index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45Utilisation de SQL Developer Data Modeler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46Suppression des tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

    2 Manipulation des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55Insertions d’enregistrements (INSERT) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

    Syntaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55Renseigner toutes les colonnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56Renseigner certaines colonnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56Ne pas respecter des contraintes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57Dates/heures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57Caractères Unicode. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60Données LOB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

    Séquences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61Création d’une séquence (CREATE SEQUENCE) . . . . . . . . . . . . . . . . . . . . . . . . . . 62Manipulation d’une séquence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64Modification d’une séquence (ALTER SEQUENCE). . . . . . . . . . . . . . . . . . . . . . . . . 65Visualisation d’une séquence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66Suppression d’une séquence (DROP SEQUENCE) . . . . . . . . . . . . . . . . . . . . . . . . . 67

    Modifications de colonnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67Syntaxe (UPDATE) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67Modification d’une colonne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68Modification de plusieurs colonnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68Ne pas respecter des contraintes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68Dates et intervalles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69

    Suppressions d’enregistrements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74Instruction DELETE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74Instruction TRUNCATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

    Intégrité référentielle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75Cohérences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75Contraintes côté « père » . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76Contraintes côté « fils ». . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76Clés composites et nulles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77Cohérence du fils vers le père. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78Cohérence du père vers le fils. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78En résumé. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

    SOUTOU Livre Page XII Vendredi, 4. janvier 2013 3:09 15

  • © Éditions Eyrolles XIII

    Table des matières

    Flottants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80Valeurs spéciales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81Fonctions pour les flottants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81

    3 Évolution d’un schéma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89Renommer une table (RENAME). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89Modifications structurelles (ALTER TABLE) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

    Ajout de colonnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90Renommer des colonnes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90Modifier le type des colonnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91Supprimer des colonnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92Colonnes UNUSED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92

    Modifications comportementales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93Ajout de contraintes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93Suppression de contraintes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94Désactivation de contraintes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96Réactivation de contraintes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98

    Contraintes différées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101Directives DEFERRABLE et INITIALLY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101Instructions SET CONSTRAINT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103Instruction ALTER SESSION SET CONSTRAINTS . . . . . . . . . . . . . . . . . . . . . . . . . 103Directives VALIDATE et NOVALIDATE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103Directive MODIFY CONSTRAINT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105

    Fonctionnalités diverses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106Colonne virtuelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106Table en lecture seule . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108

    4 Interrogation des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113Généralités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113

    Syntaxe (SELECT) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114Pseudo-table DUAL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

    Projection (éléments du SELECT) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115Extraction de toutes les colonnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116Extraction de certaines colonnes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116Alias. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117Duplicatas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117Expressions et valeurs nulles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118Ordonnancement. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118Concaténation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119Pseudo-colonne ROWID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119Pseudo-colonne ROWNUM. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120Insertion multiligne. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120

    SOUTOU Livre Page XIII Vendredi, 4. janvier 2013 3:09 15

  • SQL pour Oracle

    XIV © Éditions Eyrolles

    Restriction (WHERE) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121Opérateurs de comparaison . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122Opérateurs logiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122Opérateurs intégrés. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123

    Fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124Caractères. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125Numériques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128Dates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129Conversions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130Autres fonctions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132

    Regroupements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132Fonctions de groupe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133Étude du GROUP BY et HAVING . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134

    Opérateurs ensemblistes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137Restrictions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138Opérateur INTERSECT. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138Opérateurs UNION et UNION ALL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139Opérateur MINUS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139Ordonner les résultats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140Produit cartésien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141Bilan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142Sous-interrogations dans la clause FROM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143

    Jointures. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145Classification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145Jointure relationnelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146Jointures SQL2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146Types de jointures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147Équijointure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147Autojointure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149Inéquijointure. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150Jointures externes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151Jointures procédurales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156Jointures mixtes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160Sous-interrogations synchronisées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160Autres directives SQL2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162

    Division . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164Définition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165Classification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165Division inexacte en SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166Division exacte en SQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167

    Requêtes hiérarchiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167Point de départ du parcours (START WITH). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168Parcours de l’arbre (CONNECT BY PRIOR). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168

    SOUTOU Livre Page XIV Vendredi, 4. janvier 2013 3:09 15

  • © Éditions Eyrolles XV

    Table des matières

    Indentation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169Élagage de l’arbre (WHERE et PRIOR) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170Jointures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172Ordonnancement. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172Extraction de chemins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173Extraction d’un élément . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174Nature d’un élément . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174Éviter un cycle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175

    Mises à jour conditionnées (fusions) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177Syntaxe (MERGE) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177Exemple. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178Suppressions dans la table cible . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178Exemple. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179

    Expressions régulières . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180Quelques exemples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182Fonction REGEXP_LIKE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182Fonction REGEXP_REPLACE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185Fonction REGEXP_INSTR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186Fonction REGEXP_SUBSTR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188Sous-expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189

    Extractions diverses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190Directive WITH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190Fonction WIDTH_BUCKET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192Récursivité avec WITH (CTE) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193Pivots (PIVOT). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202Transpositions (UNPIVOT) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206Fonction LISTAGG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208

    5 Contrôle des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215Gestion des utilisateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216

    Classification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216Création d’un utilisateur (CREATE USER) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216Modification d’un utilisateur (ALTER USER) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218Suppression d’un utilisateur (DROP USER) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219Profils. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220Console Enterprise Manager. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223

    Privilèges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228Privilèges système. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228Privilèges objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231Privilèges prédéfinis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235

    Rôles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236Création d’un rôle (CREATE ROLE) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237Rôles prédéfinis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238Console Enterprise Manager. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239

    SOUTOU Livre Page XV Vendredi, 4. janvier 2013 3:09 15

  • SQL pour Oracle

    XVI © Éditions Eyrolles

    Révocation d’un rôle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240Activation d’un rôle (SET ROLE). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241Modification d’un rôle (ALTER ROLE). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242Suppression d’un rôle (DROP ROLE) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243

    Vues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243Création d’une vue (CREATE VIEW) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244Classification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246Vues monotables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246Vues complexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251Autres utilisations de vues. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254Transmission de droits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258Modification d’une vue (ALTER VIEW) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258Suppression d’une vue (DROP VIEW) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258

    Synonymes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259Création d’un synonyme (CREATE SYNONYM) . . . . . . . . . . . . . . . . . . . . . . . . . . . 259Transmission de droits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261Suppression d’un synonyme (DROP SYNONYM) . . . . . . . . . . . . . . . . . . . . . . . . . . 261

    Dictionnaire des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261Constitution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262Classification des vues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262Démarche à suivre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263Principales vues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265Objets d’un schéma. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267Structure d’une table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267Recherche des contraintes d’une table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268Composition des contraintes d’une table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268Détails des contraintes référentielles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268Recherche du code source d’un sous-programme . . . . . . . . . . . . . . . . . . . . . . . . . . 269Recherche des utilisateurs d’une base de données . . . . . . . . . . . . . . . . . . . . . . . . . 270Rôles reçus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270

    Partie II PL/SQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275

    6 Bases du PL/SQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277Généralités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277

    Environnement client-serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277Avantages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278Structure d’un programme. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278Portée des objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279Jeu de caractères . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280Identificateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280Commentaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281

    SOUTOU Livre Page XVI Vendredi, 4. janvier 2013 3:09 15

  • © Éditions Eyrolles XVII

    Table des matières

    Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281Variables scalaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282Affectations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282Restrictions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283Variables %TYPE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283Variables %ROWTYPE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284Variables RECORD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285Variables tableaux (type TABLE) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286Résolution de noms. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288Opérateurs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288Variables de substitution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289Variables de session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290Conventions recommandées. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290

    Types de données PL/SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291Types prédéfinis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291Sous-types. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291Le sous-type SIMPLE_INTEGER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292Les sous-types flottants. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293Variable de type séquence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293Conversions de types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294

    Structures de contrôles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294Structures conditionnelles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294Structures répétitives. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297La directive CONTINUE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301

    Interactions avec la base. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302Extraire des données. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302Manipuler des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304Curseurs implicites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306Paquetage DBMS_OUTPUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307

    Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310Caractéristiques. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310Début et fin d’une transaction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311Contrôle des transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312Transactions imbriquées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313

    7 Programmation avancée. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317Sous-programmes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317

    Généralités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317Procédures cataloguées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318Fonctions cataloguées. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319Codage d’un sous-programme PL/SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320Exemples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320Compilation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323Appels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323

    SOUTOU Livre Page XVII Vendredi, 4. janvier 2013 3:09 15

  • SQL pour Oracle

    XVIII © Éditions Eyrolles

    À propos des paramètres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325Récursivité. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326Sous-programmes imbriqués . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326Recompilation d’un sous-programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328Destruction d’un sous-programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328

    Paquetages (packages) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328Généralités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328Spécification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329Compilation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330Implémentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330Appel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331Surcharge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331Recompilation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331Destruction d’un paquetage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331Comment retourner une table ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332

    Curseurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332Généralités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333Instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333Parcours d’un curseur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334Utilisation de structures (%ROWTYPE) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335Boucle FOR (gestion semi-automatique) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336Utilisation de tableaux (type TABLE). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337Utilisation de LIMIT et BULK COLLECT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338Paramètres d’un curseur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339Accès concurrents (FOR UPDATE et CURRENT OF) . . . . . . . . . . . . . . . . . . . . . . . 340Variables curseurs (REF CURSOR) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341Fonctions table pipelined. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343

    Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345Généralités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345Exception interne prédéfinie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347Exception utilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351Utilisation du curseur implicite. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353Exception interne non prédéfinie. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354Propagation d’une exception. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355Procédure RAISE_APPLICATION ERROR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357

    Déclencheurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358À quoi sert un déclencheur ?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358Généralités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359Mécanisme général . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359Syntaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360Déclencheurs LMD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361Transactions autonomes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373Déclencheurs LDD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374Déclencheurs d’instances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374

    SOUTOU Livre Page XVIII Vendredi, 4. janvier 2013 3:09 15

  • © Éditions Eyrolles XIX

    Table des matières

    Appels de sous-programmes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375Gestion des déclencheurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376Ordre d’exécution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377Tables mutantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377Nouveautés 11g . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378

    SQL dynamique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382Classification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383Utilisation de EXECUTE IMMEDIATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383Utilisation d’une variable curseur. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385

    Partie III SQL avancé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389

    8 Le précompilateur Pro*C/C++. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391Généralités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391

    Ordres SQL intégrés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392Variable indicatrice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393Cas du VARCHAR. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394Zone de communication (SQLCA). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394Connexion à une base. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395Gestion des exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396

    Extraction d’un enregistrement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396Mises à jour . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398Utilisation de curseurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398

    Variables scalaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398Variables tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399

    Utilisation de Microsoft Visual C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401

    9 L’interface JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403Généralités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403

    Classification des pilotes (drivers) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404Les paquetages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405Structure d’un programme. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406Variables d’environnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407Test de votre configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408

    Connexion à une base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408Base Access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409Base Oracle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410Base MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412Déconnexion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413Interface Connection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413Sources de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413

    SOUTOU Livre Page XIX Vendredi, 4. janvier 2013 3:09 15

  • SQL pour Oracle

    XX © Éditions Eyrolles

    États d’une connexion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414Interfaces disponibles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414Méthodes génériques pour les paramètres. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415États simples (interface Statement) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415Méthodes à utiliser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416

    Correspondances de types. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417Interactions avec la base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418

    Suppression de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418Ajout d’enregistrements. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419Modification d’enregistrements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419

    Extraction de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419Curseurs statiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420Curseurs navigables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421

    Curseurs modifiables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425Suppressions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427Modifications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428Insertions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428Restrictions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429

    Ensembles de lignes (RowSet). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430RowSet sans connexion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431RowSet avec ResultSet. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431RowSet pour XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432Mises à jour d’un RowSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433Notifications pour un RowSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433

    Interface ResultSetMetaData . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435Interface DatabaseMetaData . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436Instructions paramétrées (PreparedStatement) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438

    Extraction de données (executeQuery). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439Mises à jour (executeUpdate) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439Instruction LDD (execute) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440

    Appels de sous-programmes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440Appel d’une fonction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441Appel d’une procédure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442

    Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443Points de validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443

    Traitement des exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445Affichage des erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445Traitement des erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446

    10 Oracle et PHP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449Configuration adoptée. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449

    Les logiciels. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449Les fichiers de configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450Test d’Apache et de PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450Test d’Apache, de PHP et d’Oracle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451

    SOUTOU Livre Page XX Vendredi, 4. janvier 2013 3:09 15

  • © Éditions Eyrolles XXI

    Table des matières

    API de PHP pour Oracle (OCI). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452Connexions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452Constantes prédéfinies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453

    Interactions avec la base. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454Extractions simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455Passage de paramètres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459Traitements des erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 460Procédures cataloguées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463Métadonnées. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464

    API Objet PHP pour Oracle (PDO) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467Connexions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467Mises à jour . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468Extractions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470Procédures cataloguées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471

    11 Oracle XML DB. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473Généralités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473

    Comment disposer de XML DB ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473Le type de données XMLType. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474Modes de stockage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475

    Stockages XMLType . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476Création d’une table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477Répertoire de travail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479Grammaire XML Schema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479Annotation de la grammaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480Enregistrement de la grammaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482Stockage structuré (object-relational) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484Stockage non structuré (CLOB) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501Stockage non structuré (binary XML) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502

    Autres fonctionnalités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506Génération de contenus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506Vues XMLType . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 507Génération de grammaires annotées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510Dictionnaire des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512

    XML DB Repository . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514Interfaces. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514Paquetage XML_XDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517Accès par SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517

    12 Optimisations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525Cadre général . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525

    Les acteurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526Contexte et objectifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526

    SOUTOU Livre Page XXI Vendredi, 4. janvier 2013 3:09 15

  • SQL pour Oracle

    XXII © Éditions Eyrolles

    À éviter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527Présentation du jeu d’exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527L’offre d’Oracle 11g . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528Les optimiseurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529L’estimateur. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531Traitement d’une instruction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532Configuration de l’optimiseur (les hints) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534

    Les statistiques destinées à l’optimiseur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535Les histogrammes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535Collecte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 537

    Outils de mesure de performances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 540Visualisation des plans d’exécution. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541L’outil tkprof . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547Utilisation de l’événement 10046 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 552Paquetage DBMS_APPLICATION_INFO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553Les vues dynamiques du dictionnaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557L’utilitaire runstats de Tom Kyte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 561Bilan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563

    Organisation des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564Des contraintes au plus près des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564Indexation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 565Jointures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578Variables de lien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586Comment réaliser des fetchs multilignes ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588

    Clusters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589Un mauvais et un bon exemples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 590Création d’un cluster . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 591Cluster indexé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592Hash clusters. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596Les collisions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597Paramétrages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 598Cas particuliers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 598Bilan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 601

    Tables organisées en index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 601Comparatif. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 602Les débordements. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 603Création d’une IOT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 603Comparaison avec une table en heap. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 604Limites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 604

    Partitionnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 604La clé de partition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 605Partitions par intervalle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 606Intervalles automatiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607Partitions par hachage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 608

    SOUTOU Livre Page XXII Vendredi, 4. janvier 2013 3:09 15

  • © Éditions Eyrolles XXIII

    Table des matières

    Partitions par liste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 609Partitions par référence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 610Sous-partitions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 611Index partitionné . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612Index partitionné local . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 613Index partitionné global . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 614Opérations sur les partitions et index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615Partitionnement des tables IOT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615

    Vues matérialisées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 616Réécriture de requêtes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 617Le rafraîchissement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 618Exemples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 618

    Dénormalisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 620Colonnes calculées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 620Duplication de colonnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 621Ajout de clés étrangères . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 622Exemple de stratégie. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 622

    Derniers conseils . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 622Requêtes inefficaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 623Les 10 commandements de F. Brouard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 624

    Annexe : Bibliographie et webographie. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627

    Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629

    SOUTOU Livre Page XXIII Vendredi, 4. janvier 2013 3:09 15

  • © Éditions Eyrolles VII

    Avant-propos

    Nombre d’ouvrages traitent de SQL et d’Oracle ; certains résultent d’une traduction hasar-deuse et sans vocation pédagogique, d’autres ressemblent à des annuaires téléphoniques. Lessurvivants, bien qu’intéressants, ne sont quant à eux plus vraiment à jour.

    Ce livre a été rédigé avec une volonté de concision et de progression dans sa démarche ; il estillustré par ailleurs de nombreux exemples et figures. Bien que notre source principale d’infor-mations fût la documentation en ligne d’Oracle, l’ouvrage ne constitue pas, à mon sens, unsimple condensé de commandes SQL. Chaque notion importante est introduite par un exemplefacile et démonstratif (du moins je l’espère). À la fin de chaque chapitre, des exercices vouspermettront de tester vos connaissances.

    La documentation d’Oracle 11g représente plus de 1 Go de fichiers HTML et PDF (soitplusieurs dizaines de milliers de pages) ! Ainsi, il est vain de vouloir expliquer tous lesconcepts, même si cet ouvrage ressemblait à un annuaire. J’ai tenté d’extraire les aspectsfondamentaux sous la forme d’une synthèse. Ce livre résulte de mon expérience d’enseigne-ment dans des cursus d’informatique à vocation professionnelle (IUT et master Pro).

    Cet ouvrage s’adresse principalement aux novices désireux de découvrir SQL et de program-mer sous Oracle.

    ● Les étudiants trouveront des exemples pédagogiques pour chaque concept abordé, ainsique des exercices thématiques.

    ● Les développeurs C, C++, PHP ou Java découvriront des moyens de stocker leurs données.

    ● Les professionnels connaissant déjà Oracle seront intéressés par certaines nouvellesdirectives du langage.

    Les fonctionnalités de la version 11g ont été prises en compte lors de la troisième édition decet ouvrage. Certains mécanismes d’optimisation (index, clusters, partitionnement, tablesorganisées en index, vues matérialisées et dénormalisation) sont apparus lors de la quatrièmeédition en même temps que quelques nouveautés SQL (pivots, transpositions, requêtes pipeline, CTE et récursivité). La cinquième édition enrichissait l’intégration avec Java (connexionà une base MySQL, Data Sources et RowSets) et PHP (API PDO : PHP Data Objects). Cettesixième édition présente l’outil SQL Data Modeler et actualise principalement la partie XMLDB.

    SOUTOU Livre Page VII Vendredi, 4. janvier 2013 3:09 15

  • SQL pour Oracle

    VIII © Éditions Eyrolles

    Par ailleurs, sont disponibles en téléchargement sur la fiche de l’ouvrage (à l’adressewww.editions-eyrolles.com), quatre compléments qui traitent d’un usage d’Oracle moinscourant :

    ● l’installation de versions qui ne sont plus supportées par l’éditeur (ou en fin de support)(complément 1 : Installation des versions 9i et 10g) ;

    ● la technologie SQLJ (complément 2 : L’approche SQLJ) ;

    ● les procédures externes (complément 3 : Procédures stockées et externes) ;

    ● les fonctions PL/SQL pour construire des pages HTML (complément 4 : PL/SQL WebToolkit et PL/SQL Server Pages).

    Guide de lecture

    Ce livre s’organise autour de trois parties distinctes mais complémentaires. La première inté-ressera le lecteur novice en la matière, car elle concerne les instructions SQL et les notions debase d’Oracle. La deuxième partie décrit la programmation avec le langage procédurald’Oracle PL/SQL. La troisième partie attirera l’attention des programmeurs qui envisagentd’utiliser Oracle tout en programmant avec des langages évolués (C, C++, PHP ou Java) ouvia des interfaces Web.

    Première partie : SQL de baseCette partie présente les différents aspects du langage SQL d’Oracle en étudiant en détail lesinstructions élémentaires. À partir d’exemples simples et progressifs, nous expliquons notammentcomment déclarer, manipuler, faire évoluer et interroger des tables avec leurs différentes caracté-ristiques et éléments associés (contraintes, index, vues, séquences). Nous étudions aussi SQLdans un contexte multi-utilisateur (droits d’accès), et au niveau du dictionnaire de données.

    Deuxième partie : PL/SQLCette partie décrit les caractéristiques du langage procédural PL/SQL d’Oracle. Le chapitre 6aborde des éléments de base (structure d’un programme, variables, structures de contrôle, inter-actions avec la base, transactions). Le chapitre 7 traite des sous-programmes, des curseurs, dela gestion des exceptions, des déclencheurs et de l’utilisation du SQL dynamique.

    Troisième partie : SQL avancéCette partie intéressera les programmeurs qui envisagent d’exploiter une base Oracle en utili-sant un langage de troisième ou quatrième génération (C, C++ ou Java), ou en employant une

    SOUTOU Livre Page VIII Vendredi, 4. janvier 2013 3:09 15

    http://www.editions-eyrolles.com

  • © Éditions Eyrolles IX

    Avant-propos

    interface Web. Le chapitre 8 est consacré à l’étude des mécanismes de base du précompilateurd’Oracle Pro*C/C++. Le chapitre 9 présente les principales fonctionnalités de l’API JDBC.Le chapitre 10 traite des deux principales API disponibles avec le langage PHP (OCI8 etPDO). Le chapitre 11 présente les fonctionnalités de XML DB et l’environnement XML DBRepository. Enfin, le chapitre 12 est dédié à l’optimisation des requêtes et des schémas rela-tionnels.

    Annexe : bibliographie et webographieVous trouverez en annexe une bibliographie consacrée à Oracle ainsi que de nombreux sitesWeb que j’ai jugé intéressant de mentionner ici.

    Conventions d’écriture et pictogrammes

    La police courrier est utilisée pour souligner les instructions SQL, noms de types, tables,contraintes, etc. (exemple : SELECT nom FROM Pilote).

    Les majuscules sont employées pour les directives SQL, et les minuscules pour les autreséléments. Les noms des tables, index, vues, fonctions, procédures, etc., sont précédés d’unemajuscule (exemple : la table CompagnieAerienne contient la colonne nomComp).

    Les termes d’Oracle (bien souvent traduits littéralement de l’anglais) sont notés en italique(exemple : row, trigger, table, column, etc.).

    Dans une instruction SQL, les symboles { et } désignent une liste d’éléments, et le symbole |un choix (exemple : CREATE { TABLE | VIEW }. Les symboles [et ] précisent le caractèreoptionnel d’une directive au sein d’une commande (exemple : CREATE TABLE Avion (…)[ORGANISATION INDEX];).

    Ce pictogramme introduit une définition, un concept ou une remarque importante. Il apparaîtsoit dans une partie théorique, soit dans une partie technique, pour souligner des instructionsimportantes ou la marche à suivre avec SQL.

    Ce pictogramme annonce soit une impossibilité de mise en œuvre d’un concept, soit une miseen garde. Il est principalement utilisé dans la partie consacrée à SQL.

    Ce pictogramme indique une astuce ou un conseil personnel.

    SOUTOU Livre Page IX Vendredi, 4. janvier 2013 3:09 15

  • SQL pour Oracle

    X © Éditions Eyrolles

    Contact avec l’auteur et site Web

    Si vous avez des remarques à formuler sur le contenu de cet ouvrage, n’hésitez pas à m’écrire([email protected]). Vous trouverez sur le site d’accompagnement, accessible parwww.editions-eyrolles.com, les compléments et errata, ainsi que le code de tous les exemples etles exercices corrigés.

    SOUTOU Livre Page X Vendredi, 4. janvier 2013 3:09 15

  • © Éditions Eyrolles 31

    Chapitre 1

    Définition des données

    Ce chapitre décrit les instructions SQL qui constituent l’aspect LDD (langage de définition desdonnées) de SQL. À cet effet, nous verrons notamment comment déclarer une table, ses éven-tuels contraintes et index.

    Tables relationnelles

    Une table est créée en SQL par l’instruction CREATE TABLE, modifiée au niveau de sa struc-ture par l’instruction ALTER TABLE et supprimée par la commande DROP TABLE.

    Création d’une table (CREATE TABLE)

    Pour pouvoir créer une table dans votre schéma, il faut que vous ayez reçu le privilègeCREATE TABLE. Si vous avez le privilège CREATE ANY TABLE, vous pouvez créer des tablesdans tout schéma. Le mécanisme des privilèges est décrit au chapitre « Contrôle des données ».

    La syntaxe SQL simplifiée est la suivante :

    CREATE TABLE [schéma.]nomTable

    ( colonne1 type1 [DEFAULT valeur1] [NOT NULL]

    [, colonne2 type2 [DEFAULT valeur2] [NOT NULL] ]

    [CONSTRAINT nomContrainte1 typeContrainte1]…) ;

    ● schéma : s’il est omis, il sera assimilé au nom de l’utilisateur connecté. S’il est précisé, ildésigne soit l’utilisateur courant soit un autre utilisateur de la base (dans ce cas, il faut quel’utilisateur courant ait le droit de créer une table dans un autre schéma). Nous aborderonsces points dans le chapitre 5 et nous considérerons jusque-là que nous travaillons dans leschéma de l’utilisateur couramment connecté (ce sera votre configuration la plupart dutemps).

    ● nomTable : peut comporter des lettres majuscules ou minuscules (accentuées ou pas),des chiffres et les symboles, par exemple : _, $ et #. Oracle est insensible à la casse etconvertira au niveau du dictionnaire de données les noms de tables et de colonnes enmajuscules.

    SOUTOU Livre Page 31 Vendredi, 4. janvier 2013 3:09 15

  • Partie I SQL de base

    32 © Éditions Eyrolles

    ● colonnei typei : nom d’une colonne (mêmes caractéristiques que pour les noms destables) et son type (NUMBER, CHAR, DATE…). Nous verrons quels types Oracle propose.La directive DEFAULT fixe une valeur par défaut. La directive NOT NULL interdit que lavaleur de la colonne soit nulle.

    NULL représente une valeur qu’on peut considérer comme non disponible, non affectée, incon-nue ou inapplicable. Elle est différente d’un espace pour un caractère ou d’un zéro pour unnombre.

    ● nomContraintei typeContraintei : noms de la contrainte et son type (cléprimaire, clé étrangère, etc.). Nous allons détailler dans le paragraphe suivant les différen-tes contraintes possibles.

    ● ; : symbole qui termine une instruction SQL d’Oracle. Le slash (/) peut également termi-ner une instruction à condition de le placer à la première colonne de la dernière ligne.

    Casse et commentaires

    Dans toute instruction SQL (déclaration, manipulation, interrogation et contrôle des données),il est possible d’inclure des retours chariots, des tabulations, espaces et commentaires (sur uneligne précédée de deux tirets --, sur plusieurs lignes entre /* et */). De même, la casse n’apas d’importance au niveau des mots-clés de SQL, des noms de tables, colonnes, index, etc.Les scripts suivants décrivent la déclaration d’une même table en utilisant différentesconventions :

    La casse a une incidence majeure dans les expressions de comparaison entre colonnes etvaleurs, que ce soit dans une instruction SQL ou un test dans un programme. Ainsi, l’expression

    Tableau 1-1 Différentes écritures SQL

    Sans commentaire Avec commentaires

    CREATE TABLE MêmesévénementsàNoël(colonne CHAR);

    CREATE TABLE Test (colonne NUMBER(38,8));

    CREATE table test (Colonne NUMBER(38,8));

    CREATE TABLE -- nom de la tableTEST( -- description COLONNE NUMBER(38,8) )-- fin, ne pas oublier le point-virgule.;CREATE TABLE Test ( /* une plus grande description des colonnes */ COLONNE NUMBER(38,8));

    SOUTOU Livre Page 32 Vendredi, 4. janvier 2013 3:09 15

  • © Éditions Eyrolles 33

    chapitre n° 1 Définition des données

    « nomComp='Air France' » n’aura pas la même signification que l’expression « nomComp='AIR France' ».

    Comme nous le conseillons dans l’avant-propos, il est préférable d’utiliser les conventionssuivantes.

    • Tous les mots-clés de SQL sont notés en MAJUSCULES.

    • Les noms de tables sont notés en Minuscules (excepté la première lettre).

    • Les noms de colonnes et de contraintes en minuscules.

    L’adoption de ces conventions rendra vos requêtes, scripts et programmes plus lisibles (un peuà la mode Java).

    Premier exempleLe tableau ci-dessous décrit l’instruction SQL qui permet de créer la table Compagnie illus-trée par la figure suivante dans le schéma soutou (l’absence du préfixe « soutou. » auraitconduit au même résultat si soutou était l’utilisateur qui crée la table).

    ContraintesLes contraintes ont pour but de programmer des règles de gestion au niveau des colonnes destables. Elles peuvent alléger un développement côté client (si on déclare qu’une note doit êtrecomprise entre 0 et 20, les programmes de saisie n’ont plus à tester les valeurs en entrée maisseulement le code retour après connexion à la base ; on déporte les contraintes côté serveur).

    Figure 1-1 Table à créer

    Tableau 1-2 Création d’une table et de ses contraintes

    Instruction SQL Commentaires

    CREATE TABLE soutou.Compagnie (comp CHAR(4), nrue NUMBER(3), rue CHAR(20), ville CHAR(15) DEFAULT 'Paris', nomComp CHAR(15) NOT NULL);

    La table contient cinq colonnes (quatre chaînes de caractères et une valeur numérique de trois chiffres).La table inclut en plus deux contraintes :• DEFAULT qui fixe Paris comme valeur par défaut de

    la colonne ville ;• NOT NULL qui impose une valeur non nulle dans la

    colonne nomComp.

    SOUTOU Livre Page 33 Vendredi, 4. janvier 2013 3:09 15

  • Partie I SQL de base

    34 © Éditions Eyrolles

    Les contraintes peuvent être déclarées de deux manières :

    ● En même temps que la colonne (valable pour les contraintes monocolonnes), ces contraintessont dites « en ligne » (inline constraints). L’exemple précédent en déclare deux.

    ● Une fois la colonne déclarée, ces contraintes ne sont pas limitées à une colonne et peuventêtre personnalisées par un nom (out-of-line constraints).

    Oracle recommande de déclarer les contraintes NOT NULL en ligne, les autres peuvent êtredéclarées soit en ligne, soit nommées. Étudions à présent les types de contraintes nommées(out-of-line).

    Quatre types de contraintes sont possibles :

    CONSTRAINT nomContrainte

    • UNIQUE (colonne1 [,colonne2]…)

    • PRIMARY KEY (colonne1 [,colonne2]…)

    • FOREIGN KEY (colonne1 [,colonne2]…)

    REFERENCES [schéma.]nomTablePere (colonne1 [,colonne2]…)

    [ON DELETE { CASCADE | SET NULL }]

    • CHECK (condition)

    ● La contrainte UNIQUE impose une valeur distincte au niveau de la table (les valeurs nullesfont exception à moins que NOT NULL soit aussi appliquée sur les colonnes).

    ● La contrainte PRIMARY KEY déclare la clé primaire de la table. Un index est généré auto-matiquement sur la ou les colonnes concernées. Les colonnes clés primaires ne peuventêtre ni nulles ni identiques (en totalité si elles sont composées de plusieurs colonnes).

    ● La contrainte FOREIGN KEY déclare une clé étrangère entre une table enfant (child) et unetable père (parent). Ces contraintes définissent l’intégrité référentielle que nous aborderonsplus tard. La directive ON DELETE dispose de deux options : CASCADE propagera lasuppression de tous les enregistrements fils rattachés à l’enregistrement père supprimé,SET NULL positionnera seulement leur clé étrangère à NULL (voir la section « Intégritéréférentielle » du chapitre 2 ).

    ● La contrainte CHECK impose un domaine de valeurs ou une condition simple oucomplexe entre colonnes (exemple : CHECK (note BETWEEN 0 AND 20), CHECK(grade='Copilote' OR grade='Commandant')).

    Il n’est pas recommandé de définir des contraintes sans les nommer (bien que cela soit possi-ble), car il sera difficile de faire évoluer les contraintes déclarées (désactivation, réactivation,suppression) et la lisibilité des programmes en sera affectée.

    Si vous ne nommez pas une contrainte, un nom est automatiquement généré sous la formesuivante : SYS_Cnnnnnn (n entier).

    Nous verrons au chapitre 3 comment ajouter, supprimer, désactiver, réactiver et différer descontraintes (options de la commande ALTER TABLE).

    SOUTOU Livre Page 34 Vendredi, 4. janvier 2013 3:09 15

  • © Éditions Eyrolles 35

    chapitre n° 1 Définition des données

    Conventions recommandéesAdoptez les conventions d’écriture suivantes pour vos contraintes :

    • Préfixez par pk_ le nom d’une contrainte clé primaire, fk_ une clé étrangère, ck_ une vérifi-cation, un_ une unicité.

    • Pour une contrainte clé primaire, suffixez du nom de la table la contrainte (exemple pk_Pilote).

    • Pour une contrainte clé étrangère, renseignez (ou abrégez) les noms de la table source, dela clé, et de la table cible (exemple fk_Pil_compa_Comp).

    En respectant nos conventions, déclarons les tables de l’exemple suivant (Compagnie avec saclé primaire et Pilote avec ses clés primaire et étrangère). Du fait de l’existence de la cléétrangère, la table Compagnie est dite « parent » (ou « père ») de la table Pilote « enfant »(ou « fils »). Cela résulte de l’implantation d’une association un-à-plusieurs entre les deuxtables (bibliographie UML 2 pour les bases de données). Nous reviendrons sur ces principes àla section « Intégrité référentielle » du prochain chapitre.

    Figure 1-2 Deux tables à créer

    Tableau 1-3 Contraintes en ligne et nommées

    Tables Contraintes

    CREATE TABLE Compagnie(comp VARCHAR2(4), nrue NUMBER(3), rue VARCHAR2(20), ville VARCHAR2(15) DEFAULT 'Paris', nomComp VARCHAR2(15) NOT NULL,CONSTRAINT pk_Compagnie PRIMARY KEY(comp));

    Deux contraintes en ligne et une contrainte nommée de clé primaire.

    CREATE TABLE Pilote(brevet VARCHAR2(6), nom VARCHAR2(15) CONSTRAINT nn_nom NOT NULL, nbHVol NUMBER(7,2), compa VARCHAR2(4),CONSTRAINT pk_Pilote PRIMARY KEY(brevet),CONSTRAINT ck_nbHVol CHECK (nbHVol BETWEEN 0 AND 20000),CONSTRAINT un_nom UNIQUE (nom),CONSTRAINT fk_Pil_compa_Comp FOREIGN KEY(compa) REFERENCES Compagnie(comp));

    Une contrainte en ligne nommée (NOT NULL) et quatre contraintes hors ligne nommées :• Clé primaire• CHECK (nombre d’heures de vol

    compris entre 0 et 20000)• UNIQUE (homonymes interdits)• Clé étrangère

    SOUTOU Livre Page 35 Vendredi, 4. janvier 2013 3:09 15

  • Partie I SQL de base

    36 © Éditions Eyrolles

    Remarques

    • L’ordre n’est pas important dans la déclaration des contraintes nommées.• Une contrainte NOT NULL doit être déclarée dans un CHECK si elle est nommée.• PRIMARY KEY équivaut à : UNIQUE + NOT NULL + index.• L’ordre de création des tables est important quand on définit les contraintes en même temps

    que les tables (on peut différer la création ou l’activation des contraintes, voir le chapitre 3).Il faut créer d’abord les tables « pères » puis les tables « fils ». Le script de destruction destables suit le raisonnement inverse.

    Types des colonnesPour décrire les colonnes d’une table, Oracle fournit les types prédéfinis suivants (built-in datatypes) :

    ● caractères (CHAR, NCHAR, VARCHAR2, NVARCHAR2, CLOB, NCLOB, LONG) ;

    ● valeurs numériques NUMBER ;

    ● date/heure (DATE, INTERVAL DAY TO SECOND, INTERVAL YEAR TO MONTH,TIMESTAMP, TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE) ;

    ● données binaires (BLOB, BFILE, RAW, LONG RAW) ;

    ● adressage des enregistrements ROWID.

    Détaillons à présent ces types. Nous verrons comment utiliser les plus courants au chapitre 2et les autres au fil de l’ouvrage.

    CaractèresLes types CHAR et NCHAR permettent de stocker des chaînes de caractères de taille fixe.

    Les types VARCHAR2 et NVARCHAR2 permettent de stocker des chaînes de caractères de taillevariable (VARCHAR est maintenant remplacé par VARCHAR2).

    Les types NCHAR et NVARCHAR2 permettent de stocker des chaînes de caractères Unicode(multibyte), méthode de codage universelle qui fournit une valeur de code unique pour chaquecaractère quels que soient la plate-forme, le programme ou la langue. Unicode est utilisé parXML, Java, JavaScript, LDAP, et WML. Ces types Oracle sont proposés dans le cadre NLS(National Language Support).

    Les types CLOB et NCLOB permettent de stocker des flots de caractères (exemple : du texte).

    N’utilisez le type CHAR que si vos données « remplissent bien » la taille définie par la colonne.En effet, la chaîne « Oracle » dans un CHAR(500) réservera 500 octets pour n’en stocker que6 en réalité. Il est même conseillé de ne pas utiliser ce type.

    Le type VARCHAR est obsolète (il permettait de gérer des chaînes de taille variable jusqu’à2 000 caractères, et utilisait des valeurs NULL pour compléter la taille maximale de chaquedonnée). Depuis la version 9i, ce type est devenu un synonyme de VARCHAR2 (qui n’occupepas d’espace supplémentaire à la taille de la donnée).

    SOUTOU Livre Page 36 Vendredi, 4. janvier 2013 3:09 15

  • © Éditions Eyrolles 37

    chapitre n° 1 Définition des données

    Valeurs numériques

    Le type NUMBER sert à stocker des entiers positifs ou négatifs, des réels à virgule fixe ou flot-tante. La plage de valeurs possibles va de ±1 ×10–130 à ±9.9…99 ×10125 (trente-huit 9 suivis dequatre-vingt-huit 0).

    Lorsque la valeur de d est négative, l’arrondi se réalise à gauche de la décimale comme lemontre le tableau suivant.

    Tableau 1-4 Types de données caractères

    Type Description Commentaire pour une colonne

    CHAR(n [BYTE | CHAR])

    Chaîne fixe de n caractères ou octets.

    Taille fixe (complétée par des blancs si nécessaire). Maximum de 2 000 octets ou caractères.

    VARCHAR2(n [BYTE|CHAR])

    Chaîne variable de n caractères ou octets.

    Taille variable. Maximum de 4 000 octets ou caractères.

    NCHAR(n) Chaîne fixe de n caractères Unicode.

    Taille fixe (complétée par des blancs si nécessaire). Taille double pour le jeu AL16UTF16 et triple pour le jeu UTF8. Maximum de 2 000 caractères.

    NVARCHAR2(n) Chaîne variable de n caractères Unicode.

    Taille variable. Mêmes caractéristiques que NCHAR sauf pour la taille maximale qui est ici de 4 000 octets.

    CLOB Flot de caractères (CHAR).

    Jusqu’à 4 gigaoctets.

    NCLOB Flot de caractères Unicode (NCHAR).

    Idem CLOB.

    LONG Flot variable de caractères.

    Jusqu’à 2 gigaoctets. Plus utilisé mais fourni pour assurer la compatibilité avec les anciennes applications.

    Tableau 1-5 Type de données numériques

    Type Description Commentaires pour une colonne

    NUMBER[(t,d)] Flottant de t chiffres dont d décimales.

    Maximum pour t : 38. Plage pour d : [– 84, + 127].Espace maximum utilisé : 21 octets.

    Tableau 1-6 Représentation du nombre 7456123.89

    Type Description

    NUMBER 7456123.89

    NUMBER(9) 7456124

    NUMBER(9,2) 7456123.89

    NUMBER(9,1) 7456123.9

    NUMBER(6) Précision inférieure à la taille du nombre.

    NUMBER(7,-2) 7456100

    NUMBER(-7,2) Précisi