3
BD et programmation – TD n° 4 1/3 Université Lumière – Lyon 2, Faculté de Sciences Économiques et de Gestion Master d’Informatique M2 spécialité IUP IDS – Année 2005-2006 Bases de données et programmation – TD n° 4 J. Darmont (http://eric.univ-lyon2.fr/~jdarmont/), 08/11/05 Rappel : Débogage des procédures stockées Si une procédure stockée ou une définition de paquetage ou de corps de paquetage n’est pas correcte, Oracle indique uniquement qu’elle a été créée « avec des erreurs de compilation ». Pour visualiser ces erreurs, utiliser la commande suivante. SHOW ERRORS Exercice 1 : Procédure stockée 1. Écrire un bloc PL/SQL anonyme permettant d’afficher les noms des n premiers employés de la table EMP du TD n° 2 (il est possible de recopier la table DARMONT.EMP si vous n’en disposez plus). Le nombre n pourra être stocké dans une variable. Gérer le cas où n est plus grand que le nombre de n-uplets de la table EMP. 2. Transformer le bloc anonyme en procédure stockée nommée « noms_emp », la variable n devenant un paramètre d’entrée. Tester depuis l’invite de commande SQL*Plus (commandes EXECUTE noms_emp(3), puis EXECUTE noms_emp(45) par exemple). 3. Quitter le client SQL*Plus, relancer SQL*Plus et exécuter à nouveau la procédure « noms ». Conclusion ? 4. Écrire un bloc PL/SQL anonyme incluant la déclaration et l’initialisation de deux variables n1 et n2 et faisant appel à la procédure « noms_emp » en lui passant successivement ces variables en paramètre. Exercice 2 : Paquetage On désire mettre en place un paquetage logiciel permettant de gérer la table PILOTE du TD n° 1 (il est possible de recopier la table DARMONT.PILOTE si vous n’en disposez plus). L’objectif est de disposer de procédures permettant de : afficher le contenu de la table au format Numéro : Prénom NOM (Ville) - Salaire ; ajouter un pilote ; supprimer un pilote (connaissant son numéro) ; modifier un pilote ; compter les pilotes. 1. Définir les spécifications d’un paquetage nommé « pilotes » contenant : un type enregistrement nommé « PilNUplet » contenant les champs suivants : num, nom, prenom, vil, et sal. Utiliser exactement le types des champs de la table PILOTE ; un curseur nommé « les_pilotes » retournant un « PilNUplet ». BD et programmation – TD n° 4 2/3 2. Définir le corps du paquetage « pilotes » : définir complètement le curseur « les_pilotes ». Tester la création du paquetage. 3. Ajouter aux spécifications et au corps du paquetage une procédure nommée « afficher » (pas de paramètre) permettant d’afficher les pilotes à l’écran au format désiré. Utiliser dans le corps de cette procédure le curseur « les_pilotes » et une variable locale de type « PilNUplet ». Tester la procédure (EXECUTE pilotes.afficher). 4. Ajouter aux spécifications et au corps du paquetage une procédure nommée « ajouter » permettant d’ajouter dans la table PILOTE un pilote dont les numéro, nom, prénom, ville et salaire sont passés en paramètres. Tester la procédure. 5. Ajouter aux spécifications et au corps du paquetage une procédure nommée « supprimer » permettant de supprimer de la table PILOTE un pilote dont le numéro est passé en paramètre. Tester la procédure. 6. Ajouter aux spécifications et au corps du paquetage une procédure nommée « modifier » permettant de modifier dans la table PILOTE un pilote dont les numéro, nom, prénom, ville et salaire sont passés en paramètres. Tester la procédure. 7. Ajouter aux spécifications et au corps du paquetage une fonction nommée « compter » retournant un entier et permettant de compter le nombre de n-uplets de la table PILOTE. Tester l’appel de la fonction à l’aide de la commande EXECUTE de SQL*Plus, puis dans un bloc PL/SQL anonyme. Exercice 3 : Requête dynamique (altération de schéma paramétrée) 1. Dans un bloc PL/SQL anonyme, définir une variable chaîne de caractères nommée « Source » et lui affecter le nom d’une table de votre compte. Définir une seconde variable chaîne de caractères nommée « Destination » et lui affecter une valeur quelconque (par exemple, COPIE). Dans le code du bloc PL/SQL, programmer la copie de la table « Source » dans la table « Destination » (création de la table « Destination » avec tous les attributs et tous les n-uplets de « Source »). Tester. 2. Transformer votre bloc PL/SQL anonyme en procédure stockée prenant en paramètres la table source et la table destination. Cela fonctionne-t-il ? 3. Ajouter la mention AUTHID CURRENT_USER dans votre définition de procédure, après la définition des paramètres (par exemple, CREATE OR REPLACE PROCEDURE copie(source VARCHAR, destination VARCHAR) AUTHID CURRENT_USER IS). Tester. Qu’est-ce qui a changé ? Pourquoi cette manipulation était-elle superflue lorsque vous avez créé des procédures stockées dans les exercices précédents ? Exercice 4 : Requête dynamique (création de vue paramétrée) 1. Écrire une procédure stockée prenant en paramètre le nom d’une table et permettant de créer une vue contenant les noms de tous les attributs de cette table ainsi que leur type. Le nom de la vue devra être de la forme ATT_nom_de_la_table. Utiliser la vue système USER_TAB_COLUMNS (TABLE_NAME, COLUMN_NAME, DATA_TYPE…) pour accéder au nom et au type des attributs. Vérifier le résultat.

Bdprog Td4

  • Upload
    android

  • View
    215

  • Download
    0

Embed Size (px)

DESCRIPTION

PL/SQL

Citation preview

BD et programmation TD n 41/3 Universit Lumire Lyon 2, Facult de Sciences conomiques et de Gestion Master dInformatique M2 spcialit IUP IDS Anne 2005-2006 Bases de donnes et programmation TD n 4 J . Darmont (http://eric.univ-lyon2.fr/~jdarmont/), 08/11/05 Rappel : Dbogage des procdures stockes Siuneprocdurestockeouunedfinitiondepaquetageoudecorpsdepaquetagenestpas correcte, Oracle indique uniquement quelle a t cre avec des erreurs de compilation . Pour visualiser ces erreurs, utiliser la commande suivante. SHOWERRORS Exercice 1 : Procdure stocke 1. crire un bloc PL/SQL anonyme permettant dafficher les noms des n premiers employs de la table EMP du TD n 2 (il est possible de recopier la table DARMONT.EMP si vous nen disposez plus). Le nombre n pourra tre stock dans une variable. Grer le cas o n est plus grand que le nombre de n-uplets de la table EMP. 2.Transformerleblocanonymeenprocdurestockenomme noms_emp ,lavariablen devenantunparamtredentre.TesterdepuislinvitedecommandeSQL*Plus(commandes EXECUTEnoms_emp( 3) , puis EXECUTEnoms_emp( 45)par exemple). 3.QuitterleclientSQL*Plus,relancerSQL*Plusetexcuter nouveaulaprocdure noms . Conclusion ? 4. crire un bloc PL/SQL anonyme incluant la dclaration et linitialisation de deux variables n1 et n2 et faisant appel la procdure noms_emp en lui passant successivement ces variables en paramtre. Exercice 2 : Paquetage On dsire mettre en place un paquetage logiciel permettant de grer la table PILOTE du TD n 1 (il est possible de recopier la table DARMONT.PILOTE si vous nen disposez plus). Lobjectif est de disposer de procdures permettant de : afficher le contenu de la table au format Numr o: Pr nomNOM ( Vi l l e) - Sal ai r e ; ajouter un pilote ; supprimer un pilote (connaissant son numro) ; modifier un pilote ; compter les pilotes. 1. Dfinir les spcifications dun paquetage nomm pilotes contenant : untypeenregistrementnomm PilNUplet contenantleschampssuivants :num,nom, pr enom, vi l , et sal . Utiliser exactement le types des champs de la table PILOTE ; un curseur nomm les_pilotes retournant un PilNUplet . BD et programmation TD n 42/3 2. Dfinir le corps du paquetage pilotes : dfinir compltement le curseur les_pilotes . Tester la cration du paquetage. 3. Ajouter aux spcifications et au corps du paquetage une procdure nomme afficher (pas de paramtre) permettant dafficher les pilotes lcran au format dsir. Utiliser dans le corps de cette procdure le curseur les_pilotes et une variable locale de type PilNUplet . Tester la procdure (EXECUTEpi l ot es. af f i cher ). 4.Ajouterauxspcificationsetaucorpsdupaquetageuneprocdurenomme ajouter permettant dajouter dans la table PILOTE un pilote dont les numro, nom, prnom, ville et salaire sont passs en paramtres. Tester la procdure. 5.Ajouterauxspcificationsetaucorpsdupaquetageuneprocdurenomme supprimer permettant de supprimer de la table PILOTE un pilote dont le numro est pass en paramtre. Tester la procdure. 6.Ajouterauxspcificationsetaucorpsdupaquetageuneprocdurenomme modifier permettantdemodifierdanslatablePILOTEunpilotedontlesnumro,nom,prnom,villeet salaire sont passs en paramtres. Tester la procdure. 7. Ajouter aux spcifications et au corps du paquetage une fonction nomme compter retournant un entier et permettant de compter le nombre de n-uplets de la table PILOTE. Tester lappel de la fonction laide de la commande EXECUTE de SQL*Plus, puis dans un bloc PL/SQL anonyme. Exercice 3 : Requte dynamique (altration de schma paramtre) 1. Dans un bloc PL/SQL anonyme, dfinir une variable chane de caractres nomme Source et lui affecter le nomdune table de votre compte. Dfinir une seconde variable chane de caractres nomme Destination et lui affecter une valeur quelconque (par exemple, COPIE). Dans le code du bloc PL/SQL, programmer la copie de la table Source dans la table Destination (cration de la table Destination avec tous les attributs et tous les n-uplets de Source ). Tester. 2. Transformer votre bloc PL/SQL anonyme en procdure stocke prenant en paramtres la table source et la table destination. Cela fonctionne-t-il ? 3. Ajouter la mention AUTHI DCURRENT_USER dans votre dfinition de procdure, aprs la dfinition desparamtres(parexemple,CREATEORREPLACEPROCEDUREcopi e( sour ceVARCHAR,dest i nat i onVARCHAR) AUTHI DCURRENT_USERI S). Tester. Quest-ce qui a chang ? Pourquoi cettemanipulationtait-ellesuperfluelorsquevousavezcrdesprocduresstockesdansles exercices prcdents ? Exercice 4 : Requte dynamique (cration de vue paramtre) 1. crire une procdure stocke prenant en paramtre le nomdune table et permettant de crer une vue contenant les noms de tous les attributs de cette table ainsi que leur type. Le nomde la vue devratredelaformeATT_nom_de_l a_t abl e.UtiliserlavuesystmeUSER_TAB_COLUMNS ( TABLE_NAME, COLUMN_NAME, DATA_TYPE)pour accder au nomet au type des attributs. Vrifier le rsultat. BD et programmation TD n 43/3 NB :Danslesvuessystmes,toutesleschanesdecaractres(commelesnomsdetablesou dattributs) sont stockes en majuscules. Exercice 5 : Curseur simple et requte dynamique (requte paramtre sur rsultat de requte) crire une procdure stocke permettant de compter le nombre de n-uplets dans toutes les tables de votre catalogue systme (vue systme TAB( TNAME, TABTYPE) ). Exclure les vues (type VIEW) de ce calcul. Afficher le rsultat tri par ordre alphabtique sous la forme NOM_TABLE: NB_NUPLETS n- upl et ( s) . Grer le pluriel du mot n-uplet , qui prend un s uniquement quand la taille de la table est strictement suprieure 1 n-uplet. Exercice 6 complmentaire crire une procdure stocke permettant de rechercher les tables contenant un attribut dont le nom contient une chane de caractres passe en paramtres, ainsi que le nom, le type de cet attribut et le nombre de valeurs distinctes de cet attribut dans la table. BD et programmation TD n 44/3 Correction -- Ex. 1 CREATEORREPLACEPROCEDUREnoms_emp( nI NTEGER) I S CURSORempl oyesI SSELECTenameFROM emp;eempl oyes%ROWTYPE; BEGI N OPENempl oyes;FETCHempl oyesI NTO e;WHI LEempl oyes%FOUNDANDempl oyes%ROWCOUNT1THEN f i n: = ' n- upl et s' ;ELSE f i n: = ' n- upl et ' ;ENDI F;DBMS_OUTPUT. PUT_LI NE( t . TNAME| | ' : ' | | c| | f i n) ;ENDLOOP;END;/ -- Ex. 6 CREATEORREPLACEPROCEDUREr echer che( at t r i but VARCHAR) I S CURSORl i st eI SSELECTTABLE_NAME, COLUMN_NAME, DATA_TYPEFROM USER_TAB_COLUMNS WHERECOLUMN_NAMELI KEUPPER( ' %' | | at t r i but | | ' %' )ORDERBYTABLE_NAME;t l i st e%ROWTYPE;cI NTEGER; BEGI N FORt I Nl i st eLOOP EXECUTEI MMEDI ATE' SELECTCOUNT( DI STI NCT' | | t . COLUMN_NAME| | ' )FROM ' | | t . TABLE_NAMEI NTO c;DBMS_OUTPUT. PUT_LI NE( t . TABLE_NAME| | ' : ' | | t . COLUMN_NAME| | ' ( ' | |t . DATA_TYPE| | ' ) - ' | | c| | ' val eur sdi st i nct es' ) ;ENDLOOP;END;/