Simplifier... Programmation en PL/SQL Référence PPN MC-INFO-OMGL3 : Intégration des SGBD dans les environnements de programmation Objectifs Procédures stockées Utilisation du langage PL/SQL Mise à jour de la base de données du Tour de France Section IUT - Département Informatique Campus 3 Ifs Auteur P.Monchy maj E.Porcq Références PL/SQL : Le langage PL/SQL Oracle PL/SQL par SheikYerbouti (pl/sql.pdf) 1 EXO0 : Introduction 1.1 PLSQL_Exo0A En mode SQL, créer la table suivante. drop table bidon; create table bidon ( num number(4) primary key, type char(10), valeur number(4,2) ); Cliquer avec le bouton droit sur procédure, puis sélectionner " new procedure ". La nommer puis saisir le code cidessous. Compiler, exécuter et commenter le programme. CREATE OR REPLACE PROCEDURE PLSQL_EXO0A AS dbms_output.put_line('ceci est un' chr(10) 'message'); END PLSQL_EXO0A; 1.2 PLSQL_Exo0B Tester (et commenter) le programme suivant : CREATE OR REPLACE PROCEDURE PLSQL_EXO0B AS vnblignes int := 0; insert into bidon values(3,'ville',35.4); insert into bidon values(4,'daine',30.4); select count(*) into vnblignes from bidon; dbms_output.put_line('nb réponses : ' vnblignes); END PLSQL_EXO0B; 2 EXO1 : Exercices de base 2.1 PLSQL_Exo1A L'objectif sera d'écrire une procédure permettant de générer les 10 premiers nombres. 2.1.1 Diagramme d'activité P. Monchy maj E. Porcq Le langage SQL Exercices PL/SQL Imprimé le 14/03/11 page 1
Entrées/Sorties: PLSQL_Exo1A: :BDD i<--0 i <-- i+1 [i<10] Insertion PLSQL_TAB: [i=10] 2.1.2 Schéma de la table PLSQL_TAB nom_exercice varchar2(11) date_jour date resultat number(2) (PK) 2.1.3 Code PLSQL CREATE OR REPLACE PROCEDURE PLSQL_EXO1A as v_nom_exercice -- à compléter -- à compléter END; 2.1.4 Exécution du code Lancer le programme à partir de sqldevelopper puis vérifier le résultat Lancer une nouvelle fois la procédure. Que se passe t-il? Justifier 2.2 PLSQL_EXO1b Même exercice que précédemment avec une boucle while. Exécuter le programme au pas par pas. 2.3 PLSQL_EXO1c Même exercice que précédemment mais en affichant à l'écran les données insérées P. Monchy maj E. Porcq Le langage SQL Exercices PL/SQL Imprimé le 14/03/11 page 2
Entrées/Sorties: PLSQL_Exo1c: :BDD i<--0 i <-- i+1 [i<10] Insérer PLSQL_TAB: :Ecran Afficher [i=10] 3 EXO2 : Gestion des erreurs 3.1 PLSQL_EXO2A Objectif : Écrire une procédure stockée permettant de générer une table de multiplication. Le choix du multiplicateur, compris entre 1 et 10 sera saisi au clavier. La table de multiplication sera enregistrée dans la table PLSQL_TAB et affichée à l'écran. 3.1.1 Modification du schéma de la table PLSQL_TAB Ajouter les colonnes "multiplicande" et "multiplicateur" multiplicande number(2) multiplicateur number(2) 3.1.2 Diagramme d'activité P. Monchy maj E. Porcq Le langage SQL Exercices PL/SQL Imprimé le 14/03/11 page 3
:Entrées/Sorties PLSQL_Exo2a: :BDD :Clavier [pmultiplicateur] vmultiplicateur <- pmultiplicateur i <-- 0 i <-- i+1 :Écran Insérer Afficher PLSQL_TAB: [nom_exercice, sysdate, i,vmultiplicateur, vmultiplicateur*i] [i=10 ] 3.1.3 Code PLSQL CREATE OR REPLACE PROCEDURE PLSQL_EXO2A(pmultiplicateur varchar2) AS -- à compléter -- à compléter END PLSQL_EXO2A; 3.2 PLSQL_EXO2B Même exercice que précédemment mais en y ajoutant un contrôle d'anomalie sur la valeur saisie au clavier. create or replace PROCEDURE PLSQL_EXO2B(pMultiplicateur varchar2) AS vnomexercice plsql_tab.nom_exercice%type := 'PLSQL_EXO2B'; verreur number(1) :=0; cmessage1 constant varchar2(100) := 'il faut saisir un nombre'; cmessage2 constant varchar2(100) := 'la valeur saisie ne peut être nulle'; cmessage3 constant varchar2(100) := 'la valeur doit être comprise entre 0 et 10'; if pmultiplicateur is null then à compléter else for i in 1.. length(pmultiplicateur) loop if substr(... à compléter... then dbms_output.put_line(pmultiplicateur cmessage1); verreur := 1; à compléter P. Monchy maj E. Porcq Le langage SQL Exercices PL/SQL Imprimé le 14/03/11 page 4
3.3 PLSQL_EXO2C Même exercice que précédemment mais les erreurs seront traitées dans le secteur Exception de la procédure stockée. Le message affiché sera un message d'erreur. instructions clés : Exception Raise... raise_application_error 4 EXO3 : ANNULE 5 EXO4 : les curseurs 5.1 PLSQL_EXO4A Écrire une procédure stockée permettant de compter le nombre de coureur de la table tdf_coureur et d'afficher le résultat à l'écran. Utiliser " count ". 5.2 PLSQL_EXO4B Écrire une procédure stockée permettant d'afficher les noms des coureurs à l'écran puis d'afficher les noms des équipes (pas de lien entre les deux tables). Pour atteindre cet objectif, l'étudiant utilisera les curseurs, technique indispensable pour utiliser une requête select ramenant plusieurs lignes. CREATE OR REPLACE PROCEDURE PLSQL_EXO4B AS -- créer les curseurs curcoureur et curequipe -- déclarer les variables associées aux curseurs vnomcoureur et vnomequipe -- ouvrir les curseurs Loop -- lecture du curseur exit when -- compléter ; dbms_output.put_line(compléter); End loop ; dbms_output.put_line(' '); Loop -- lecture du curseur exit when -- compléter ; dbms_output.put_line(compléter); End loop ; -- fermer les curseurs END PLSQL_EXO4B; P. Monchy maj E. Porcq Le langage SQL Exercices PL/SQL Imprimé le 14/03/11 page 5
5.3 PLSQL_EXO4C Compléter la procédure précédente pour qu'elle affiche tous les champs des tables tdf_coureur et tdf_equipe. 5.4 PLSQL_EXO4D Écrire une procédure qui reçoit une partie du nom d'un coureur et qui affiche la liste des coureurs comportant ce mot dans leur nom. 6 EXO5 : Exercices de synthèse 6.1 PLSQL_EXO5A Écrire une procédure stockée permettant qui reçoit une année en paramètre et qui : compte le nombre de participants cette année là compte le nombre d'équipe participante cette année là insère les informations utiles dans la table plsql_tdf (à créer) Gérer les erreurs suivantes : "pas de tour de France dans la base pour cette année là" "l'année n'est pas comprise entre 1900 et 2007" Structure de la table plsql_tdf : nom_exercice varchar2(20), annee number(4), nb_coureurs number(3), nb_equipes number(2), date_jour date, binome varchar2(10) 6.2 PLSQL_EXO5B Modifier la procédure précédente de la façon suivante : on insère les informations utiles dans la table plsql_tdf du schéma "Eric" si une donnée existe déjà dans la table pour une année donnée, on affiche un message d'erreur P. Monchy maj E. Porcq Le langage SQL Exercices PL/SQL Imprimé le 14/03/11 page 6