Automatic Storage Management (ASM) is a feature provided by Oracle Corporation within the Oracle Database from release Oracle 10g (revision 1) onwards. ASM aims to simplify the management of databa...Full description
Descripción completa
oracle linux
Notes i collected during training
Full description
Clasa a XII a
technicalFull description
Tấn công rootkit
consultas de oracle 10g, un total de 20 consultasDescripción completa
Descripción completa
Administracion ParametrosDescripción completa
oracle linux
PlsqlFull description
Cours Oracle Alexan Ale xandre dre Mesl´ Mes l´ e 13 octobre 2009
Table ble des des mati` ati` eres 1 Notes de cours
Intr Introdu oduct ctio ion n Qu’e Qu’est st-c -ce e qu’u qu’un n SGBD SGBD ?
– D´ efinition efiniti on : logiciel l ogiciel qui stocke des donn´ees ees de fa¸ f a¸con con organ or ganis´ is´ee ee et coh´ coh ´erente ere nte.. – Access : version ´edulcor´ edulcor´ee. ee. Mais mono-utilisat mono-u tilisateur, eur, et faible capacit´e. e. – Les donn´ees ees sont stock´ sto ck´ees ees dans dan s des d es fichiers fichie rs g´er´ er´es es par le serveur serve ur de base de donn´ees. ees. Cette Cet te op´eration erat ion est opaque. opa que. On transmet depuis un client des instructions `a la base par l’interm´ ediaire ediaire du langage SQL. Avantages : – permet de maintenir maintenir de fa¸con con fiabl fia blee l’int´ l’ int´egrit eg rit´´e des donn´ do nn´ees ees – op´erations eration s de bas ba s niveau opaques – rapide – multi-utilisateurs – moins de trafic sur le r´eseau eseau – s´ecurit´e Incon In conv´ v´enien en ientt : – Un peu plus long que bien programm´e en C, et encore... Plusieurs fa¸cons cons d’organiser d’organi ser les donn´ees ees : – hi´erarchiqu erar chiquee – relationne relationnell – d´educt edu ctif if – objet – etc. Les gros SGBD-R : – DB2 (IBM) – Oracle Oracle – Microsoft Microsoft SQL Server Server – mySQL SQL
Structured Structured Query Language. Language. SQL est le langage langage standard standard de la base de donn´ donn´ees. ees. D’un SGBD `a l’autre, le SQL change tr`es es peu. p eu. Ce cours est surtout un cours de SQL.
1.1.2
Organisation relationnelle relationnelle des donn´ ees ees
– Les donn´es es sont stock´ees ees dans des tables. – Table : tableau tableau `a deux d eux entr´ ent r´ees. ee s. Le MPD nous donne, pour chaque table, les colonnes (i.e. champs) que doit comporter la table. n o mt mt a bl bl e ( c o l o n n e 1 , c o l o n n e 2 , . . . , c o l o n n e n ) Par exemple : 4
CLIENT( numero numero , prenom prenom , nom, em ai l ) nous donnera la table num´ero 205053 205 05372 72 ...
Supposons que l’on veuille g´erer erer des commandes ´emises emises par des clients. Nous souhaitons stocker les donn´ ees ees suivantes : – nom, pr´enom enom et adresse compl`ete ete des clients – produits propos´es es et coˆ uts uts unitaires – pour chaque commande, le d´ etail etail et le montant. Apr`es es maintes maint es p´erip´ erip´eties, etie s, nous en arrivons arri vons au MPD suivant sui vant : CLIENT( nume ro clie nt , pren prenom om , nom, adre sse1 , adre sse2 , #CP) CODE POSTAL(CP, L(CP, v i l l e ) PRODUIT( n u m er er o p r o du du i t , d e s c r i p t i o n , p r i x u n i t a i r e ) COMMANDE(#n u m e r o c l i e n t , numero com mande ) LIGNECOMMANDE(#nu me ro cl ie nt , #numero numero commande , #nu mer o pr od ui t , qu an t i t e ) Nous Nou s pouvon p ouvonss repr´ r epr´esenter esent er la base, bas e, avec quelques quel ques donn´ don n´ees ees ins´er´ er´ees, ees, par des tableau tab leaux x numero client 1 2 3 4 CP 75013 75016 95 9520 2000
prenom Alexandre Am´ed´ee Louis-Hubert
nom Mesl´e Morflegroin M´edor Martin
adresse2 28, rue du chemin vert
ville Paris Paris Sarc Sarcel elle less
numero produit 1 2 3 4 5 6 7 8 9 10
decription Boite de cornichons Goupillon Cotons-tige Ajax WC Place concert des Stones Roue de secours Compas Armoire Glu ¨ dehnblourf Pat´e di´et´etique Croquettes laxatives
#numero #numero client client 1 1 2 3
numero numero commande commande 1 2 1 1
#nume #numero ro clien clientt 1 1 1 2 3
#nume #numero ro comman commande de 1 2 2 1 1
1.1.3 1.1.3
adresse1 Cit´e les framboi boises 29 29, rue de Choisy dans sa niche 112, rue de la Pompe
prix unitaire 2.5 6.5 1.2 1.2 145 75 4 146 12 8
#nume #numero ro produit produit 5 4 7 1 9
Surv Su rvol ol de SQL SQL
Le SQL de base se d´ecline ecline en quatre parties : 5
quant quantite ite 2 29 1 4 238
#CP 75013 95200 75013 75016
– DDL : Data definition definition language language – DML : Data manipulation manipulation language language – DQL : Data query languag languagee – DCL : Data control control language language A cela s’a joute le PL/SQL. Celui-ci permet de g´erer erer presque toutes les contraintes contraintes et de maintenir la coh´ erence erence de la base de donn´ees. ees. Mais c’est beaucoup beauco up plus compliqu´ compliq u´e... e... Cr´ eer eer des tables tabl es
Les types pour commencer – num´ eriques eriques : number – chaˆ chaˆınes de carac c aract` t`eres eres : varchar2( varcha r2(tai taille) lle) syntaxe : CREATE TABLE < nomdelatable > ( < d e s c r i p t i o n c o l o n n e 1 > , . . . , < d e s c r i p t i o n c o l o n n e n >)
Pour chaque colonne : [ < o p t i o n s e v e n t u e l l e s > ]
exemple : create crea te table c l i e n t
( numcli number , nom varchar2 ( 2 5 6 ) , prenom varchar2 ( 2 5 6 ) ) Afficher le contenu d’une table
syntaxe : SELECT ∗ FROM
exemple : s e l e c t ∗ from c l i e n t Ajouter une ligne dans une table
syntaxe : nomcolonne 1 > , . . . , ) INSERT INTO < nomdelatable > (< nomcolonne INSERT VALUES (< v a l e u r c o l o n n e 1 > , . . . , < v a l e u rc r c o l o n n e n >) exemple : prenom) VALUES ( 1 , INSERT INSE RT INTO CLIENT ( numcli , nom, prenom)
1.1. 1.1.4 4
SQL+ SQL+ et iSQL iSQL
Connection
login : scott password : tiger Liste des tables SELECT t a b l e n a m e FROM u s e r t a b l e s ; Description des tables
Syntaxe :
6
’ M e sl sl e ’ , ’ A l e x a nd nd r e ’ )
DESC ;
Exemple : DESC c l i e n t ; Attention
Les commandes commandes de SQL+ se terminent terminent par un point-virgu point-virgule le !
7
1.2 1.2.1
Contraintes d´ eclaratives eclaratives Valeurs par d´ d´ efaut efaut
create crea te table c l i e n t
( numcli number , nom varchar2 ( 2 5 6 ) default ’ Moi ’ , prenom varchar2 ( 2 5 6 ) ) fait de ’Moi’ le nom par d´ efaut. efaut.
1.2.2
Champs non renseign´ renseign´ es es
create crea te table c l i e n t
( numcli number , nom varchar2 ( 2 5 6 ) NOT NULL, prenom varchar2 ( 2 5 6 ) NOT NULL ) force la saisie des champs nom et pr´ enom. enom.
1.2.3
Cl´ e primaire
Une cl´e primaire est : – toujours toujour s renseign´ee ee – unique On peut pr´eciser eciser PRIMARY KEY dans la cr´eation eation de table create crea te table c l i e n t
( numcli nu numb mber er PRIMARY KEY, nom varchar2 ( 2 5 6 ) , prenom varchar2 ( 2 5 6 ) ) La colonne numcli est cl´e primaire, toute insertion ne respectant pas la contraine de cl´e primaire sera refus´ ee ee par Oracle.
1.2.4
Cl´e ´ etrang ra ng` ` ere er e
Une Un e cl´e ´etran etr ang` g`ere ere r´ef´ ef´erence ere nce une lign li gnee d’un d’ unee tabl ta blee quelc qu elconq onque ue : Syntaxe : REFERENCES (< nomcolonne >) create crea te table c l i e n t
( numcli nu numb mber er PRIMARY KEY, nom varchar2 ( 2 5 6 ) , prenom varchar2 ( 2 5 6 ) , numdept number REFE REFERE RENC NCES ES DEPT DEPT ( nd ) ) Une ligne ne pourra ˆetre etre ins´er´ er´ ee ee dans la table client que s’il existe dans la table DEPT une ligne dont la valeur nd est la mˆ eme eme que la valeur valeur numdept en cours d’insertion. On remarque rema rque qu’il qu’i l devient devi ent impossi imp ossible ble d’´ecraser ecra ser la table tab le DEPT si elle ell e est r´ef´ ef´erenc´ eren c´ee ee par une cl´e ´etrang` etra ng`ere. ere.
1.2.5 1.2.5
Syntax Syntaxe e altern alternati ative ve
ALTER TABLE ADD [CONSTRAINT < nomcontrainte > ] < d e s c r i p t i o n c o n t r a i n t e >
8
descriptioncontrai descript ioncontrainte nte d’une d’u ne cl´e primaire pri maire : PRIMARY KEY(< c o l o n n e 1 > , . . . , < c o l o n n e n >)
descr de script iption ioncon contr trai ainte nte d’une d’u ne cl´e ´etran et rang` g`ere ere : FOREIGN KEY(< c o l o n n e 1 > , . . . , < c o l o n n e n >) REFERENCES < t a b l e r e f e r e nc n c e e > (< c o l o n n e 1 > , . . . , < c o l o n n e n >)
Il est aussi possible de placer une descriptioncontrainte dans le CREATE CREATE TABLE. Par exemple, create crea te table c l i e n t
( numcli number , nom varchar2 ( 2 5 6 ) , prenom varchar2 ( 2 5 6 ) , numdept number , PRIMARY KEY ( number ) , FOREIGN KEY ( numdept num dept ) REFERENCES DEP DEPT ( nd ) ) On remarque qu’il est possible de nommer une contrainte. C’est utile si on souhaite la supprimer : ALTER TABLE DROP CONSTRAINT
Pour lister les contraintes : SELECT ∗ FROM USER CONSTRAINTS
9
1.3
Introduction aux requˆ requˆ etes etes
1.3.1
Compl´ ements ements sur
SELECT
Il est possible d’utiliser SELECT pour n’afficher que certaines colonnes d’une table. Syntaxe : SELECT < c o l o n n e 1 > , < c o l o n n e 2 > , . . . , < c o l o n n e n > FROM
>
Cette instruction s’appelle une requˆ ete, ete, elle affichera pour chaque ligne de la table les valeurs des colonnes colonne1 `a colonnen . Il est possible de supprimer les lignes en double `a l’aide du mot-cl´e DISTINCT. Par exemple : SELECT DISTINCT < c o l o n n e 1 > , < c o l o n n e 2 > , . . . , < c o l o n n e n > > FROM
Pour trier t rier les donn´ees, ees, on utilise utilis e ORDER ORDER BY. Exemple : SELECT < c o l o n n e 1 > , < c o l o n n e 2 > , . . . , < c o l o n n e n > FROM
> ORDER BY < c o l o n n e 1 b i s > , < c o l o n n e 2 b i s > , . . . , < c o l o n n e n b i s >
Cette instruction instru ction trie les donn´ d onn´ees ees par p ar colonne1bis croissant croi ssants. s. En E n cas ca s d’´egalit´ egal it´e, e, le l e tri tr i est es t fait fa it par p ar colonne2bis croissants, etc. Pour trier par ordre ordr e d´ecroissant, ecroissant, on ajoute a joute DESC apr`es es le nom de la colonne col onne choisie chois ie comm commee crit` cr it`ere ere d´ecroiss ecro issant. ant. Par exemple : SELECT < c o l o n n e 1 > , < c o l o n n e 2 > , . . . , < c o l o n n e n > > FROM
ORDER BY < c o l o n n e 1 b i s > DESC, < c o l o n n e 2 b i s > , . . . , < c o l o n n e n b i s >
1.3.2 1.3.2
Inst Instru ruct ction ion
WHERE
Cette instruction p ermet de ne s´ electionner electionner que certaines lignes de la table. Par exemple la requˆ ete ete SELECT n o m c l ie ie n t , p r e n o m c l i e n t FROM c l i e n t WHERE n u m er er o c l i e n t = 1
va afficher a fficher les nom et pr´enom enom du client dont le num´ero ero est 1. La syntaxe g´en´ en´erale erale est SELECT < c o l o n n e 1 > , < c o l o n n e 2 > , . . . , < c o l o n n e n > FROM
> WHERE < c o n d i t i o n >
evalu´ee ee pour p our chaque ligne de la l a table, t able, et seules celles qui v´efieront efieront cette condition conditi on feront f eront partie du condition sera ´evalu´ r´esult esu ltat at de la requˆ req uˆete. et e.
1.3.3 1.3.3
Cond Condit itio ions ns
Comparaison
Les conditi cond itions ons peuvent pe uvent ˆetre etr e des relatio rela tions ns d’´egalit´ egal it´e (=), (=) , de diff´erence eren ce (<>), d’in d’ in´´egal eg alit it´´e (<, >, >= ou <=) sur des colonnes : n u m er er o c l i e n t = 2 n o m c l i e n t = ’ C h i ra ra c ’ p r e n o m c l i e n t <> ’ Hubert ’ s a l a r y < 23 0 t a x e s >= 2 3 0 0 0 N´ egat ga tion
La n´egation egation d’une condition conditi on s’obtient s’o btient a` l’aide de NOT. Par exemple, exempl e, il est possible possi ble de r´e-ecrire e-ecrire les conditions cond itions ci-avant : NOT NOT NOT NOT NOT
( n u m e r o c l i e n t <> 2 ) ( n o m c l i e n t <> ’ Chi rac ’ ) ( p r e n o m c l i e n t = ’ H u be be rt rt ’ ) ( s a l a r y >= 2 3 0 ) ( t a x e s < 23000)
10
Connecteurs logiques
De mˆeme, eme, vous avez `a votre disposition tous les connecteurs logiques binaires : AND, OR. Ainsi, les deux conditions suivantes sont les mˆemes emes : ’Bush ’ ) AND (prenom <> ’ Medor Medor ’ ) ) NOT(( nom = ’Bush (nom <> ’ Bush ’ ) OR ( prenom prenom = ’ Me Medor dor ’ ) e NULLit´
Un champ non renseign´ e a la valeur NULL, dans une comparaison, NULL n’est jamais ´egal egal a` quelque valeur qu’il soit ! La condition condition suivante suivante est toujours toujours fausse : NULL = NULL;
La requˆ r equˆete ete suivante ne renvoie aucune auc une ligne l igne : SELECT ∗ FROM EMP WHERE COMM=NULL;
Pour tester la nullit´ e d’un champ, on utilise IS NULL NULL, par exemple : SELECT ∗ FROM EMP WHERE COMM I S NULL;
La non-nullit´ e se teste de deux fa¸cons cons : WHEREN E NOT (COMM I S NULL) ; WHERE COMM I S NOT NULL Encadrement
Une Un e valeur vale ur num´erique eri que peut pe ut ˆetre et re encad en cadr´ r´ee ee `a l’aide l’ aide de l’op´ l ’op´erateur erat eur BETWEEN, par exemple les deux conditions suivantes sont ´equivalente equi valentess : SALAIRE BETWEEN 1000 AND 5000 (SALAIRE >= 1 0 0 0 ) AND (SALAIRE <= 5 0 0 0 ) Inclusion
L’op L’ op´´erat er ateu eurr IN permet permet de tester tester l’appa l’apparte rtenan nance ce `a une liste liste de valeurs aleurs.. Les deux deux proposi propositio tions ns suiv suivantes antes sont sont ´equi eq uival valent entes es NAME IN ( ’Mesle ’ , ’Bush ’Bush ’ , ’Medo ’Medorr ’ ) (NA (NAME = ’ Me sl e ’ ) OR (NA (NAME = ’ Bush ’ ) OR (NA (NAME = ’ Medor ’ ) LIKE
a comparer le contenu d’une variable `a un litt´ lit t´eral eral g´en´ en´erique. eriq ue. Par exemple exem ple,, la conditi cond ition on LIKE sert ` NAME LIKE ’M% ’ sera se ra v´erifi er ifi´´ee ee si NAME commence par un ’M’. Ca fonctionne aussi sur les valeurs valeurs de type num´erique, erique, la condition SALARY LIKE ’ %0000000 %000000000 00 ’ sera se ra v´erifi er ifi´´ee ee si SALARY se termine par 000000000. Le caract` cara ct`ere ere % peut remplacer dans le litt´eral eral n’importe que suite, vide ou non, de caract` eres eres ; il a le mˆ eme eme rˆole ole que * en DOS et en SHELL. SHELL. Le caract caract``ere ere rempla remplace ce un et un seul caract`ere ere dans le litt´eral. eral. Par exemple, la condition conditi on NAME LIKE ’ B s % ’ ne sera ser a v´erifi´ eri fi´ee ee que qu e si NAME commence par un ’B’ et contient un ’s’ en troisi`eme eme position. posit ion.
1.3.4 1.3.4
Supp Su ppre ress ssio ion n
L’expression DELETE FROM WHERE
efface de la table NOMTABLE toutes les lignes v´erifiant erifiant condition. Attention Attention ! La comma commande nde DELETE FROM
efface toutes les lignes de la table NOMTABLE ! 11
1.3.5
Mise ` a jour
L’expression UPDATE SET = , = ,
. .. , = WHERE modifie les lignes de la table NOMTABLE v´erifi er ifian antt condition. Elle affecte au champ colonnei la valeur valeuri . Par exemple, UPDATE CLIENT SET NAME = ’ Medor ’ WHERE LUNCH = ’ Bone s ’
affecte la valeur ’M´ es t ´egal eg alee `a ’Bones’. Il est possible, possible, edor’ edor’ aux champs noms de toutes les lignes dont la valeur LUNCH est dans une modification, d’utiliser les valeurs valeurs des autres champs de la ligne, voire mˆeme eme l’ancienne valeur de ce champ. Par exemple, UPDATE CLIENT SET SAL ALA ARY = SAL ALA ARY + 5 0 0 0
augmente tous les salaires de 5000 (choisissez ( choisissez l’unit´e !).
12
1.4 1.4
Join Jointu ture ress
1.4. 1.4.1 1
Prin Princi cipe pe
Etant donn´e le l e code co de ci-desso c i-dessous, us, CREATE TABLE MODULE numb mber er primary key , (numMod nu nomMod varchar2 ( 3 0 )
); CREATE TABLE PREREQUIS
( numMod number r e f e r e n c e s MODULE(nu E(numMod) , numModPrereq number r e f e r e n c e s MODULE(num (numMod) , noteMin number ( 2 ) DEFAULT 10 NOT NULL , PRIMARY KEY(numM (numMod, od, numModPrereq ) ); INSERT INSERT INSERT INSE RT INSERT INSE RT INSERT INSE RT INSERT INSE RT INSERT INSE RT INSERT INSE RT INSERT INSE RT
’ O R ac ac le le ’ ) ; ’C++’ ) ; ’C ’ ) ; ’ A l go go ’ ) ; ’ Merise ’ ) ; ’PL/ ’PL/S SQL Orac le ’ ) ; ’my ’mySQL ’ ) ; ’ A l go go a v a nc nc e e ’ ) ;
Si on souhaite connaˆıtre ıtre les num´eros eros des modules prerequis pour p our s’inscrire dans le module ’PL/SQL Oracle’, il nous faut tout d’abord d’ab ord le num´ ero ero de ce module mo dule : SQL> SELECT numMod FROM module WHERE nomMod = ’PL/ ’PL/S SQL Or ac le ’ ; NUMMOD −−−−−−−−−− 6 Ensuite, Ensuit e, cherchons cherchon s les l es num´eros eros des modules modul es pr´erequis erequis pour s’inscrire s’inscr ire dans le module modul e num´ero ero 6, SQL> SELECT numModPrereq FROM p r e r e q u i s WHERE numM umMod = 6 ; NUMMODPREREQ −−−−−−−−−−−− 1 5 Et pour finir, allons r´ ecup´ ecup´erer erer les noms de ces c es modul m odules, es, SQL> SELECT nomMod FROM module WHERE numMod IN ( 1 , 5 ) ; NOMMOD −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− Oracle Merise Vous ˆetes etes probablement tous en train de vous demander s’il n’existe pas une m´ ethode ethode plus simple et plus rapide, et surtout une fa¸con con d’automatiser ce que nous venons de faire. Il existe un moyen moyen de s´ electionner electionner des donn´ ees ees dans plusieurs tables simultan´ ement. ement. Pour traiter la question ci-dessus il suffisait de saisir : 13
SQL> SELECT m2.nomMod 2 FROM m od od ul ul e m1 m1 , m od od ul ul e m2 m2 , p r e r e q u i s p 3 WHERE m1. numM numMod od = p . numM numMod od AND m2 .num .numMod = p . numModprereq 4 AND m1. nomMod = ’PL/ ’PL/S SQL Or ac le ’ ; NOMMOD −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− Oracle Merise Le but de ce chapitre est d’expliciter ce type de commande.
1.4.2
Produit cart´ esien esien
L’instruction SELECT etendre etendre de la fa¸con con suivante : SELECT ... FROM FROM ... peut s’´ SELECT < l i s t e c o l o n n e s > FROM < l i s t e t a b l e s >
L’exemple ci-dessous vous montre le r´ esultat esultat d’une telle commande. SQL> SELECT ∗ FROM p r o p os os e r , p r o d u i t ; NUMFOU NUMPROD PRIX PRIX NUMPROD NOMPROD −−−−−−−−−− −−−−−−−−−− −−−−−−−−−− −−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 1 1 200 1 Ro ue d e s e c o u r s 1 1 200 2 P o u p e e Batman 1 1 200 3 Cot ons t i g e s 1 1 200 4 Cornichons 1 2 15 1 Ro ue d e s e c o u r s 1 2 15 2 P o u p e e Batman 1 2 15 3 Cot ons t i g e s 1 2 15 4 Cornichons 2 2 1 1 Ro ue d e s e c o u r s 2 2 1 2 P o u p e e Ba t m a n 2 2 1 3 Cot ons t i g e s NUMFOU NUMPROD PRIX PRIX NUMPROD NOMPROD −−−−−−−−−− −−−−−−−−−− −−−−−−−−−− −−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 2 2 1 4 Cornichons 3 3 2 1 Ro ue d e s e c o u r s 3 3 2 2 P o u p e e Ba t m a n 3 3 2 3 Cot ons t i g e s 3 3 2 4 Cornichons 16 lign e ( s ) sele ctio nnee ( s ). Placer une liste de tables dans le FROM revient `a former toutes les combinaisons de lignes possibles. Cependant, cela a relativement peu de sens.
1.4.3 1.4.3
Join Jointu ture re
Il serait plus int´ eressant, eressant, dans le cas pr´ esent, esent, de ne voir s’afficher que des lignes dont les num´ eros eros de produits concorden concordent. t. Pour Pour ce faire, faire, il suffit d’utiliser WHERE. Par exemple, SQL> SELECT ∗ FROM p r o p os os e r , p r o d u i t 2 WHERE prop oser .nump .numpro rod d = prod uit .numpr .numprod; od; NUMFOU NUMPROD PRIX PRIX NUMPROD NOMPROD −−−−−−−−−− −−−−−−−−−− −−−−−−−−−− −−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 1 1 200 1 Ro ue d e s e c o u r s 2 2 1 2 P o u p e e Ba t m a n 1 2 15 2 P o u p e e Batman 14
3
3
2
3 Cot ons t i g e s
Nous avons mis en correspondance des lignes de la table proposer avec des lignes de la table produit en utilisant le fait que numprod est es t une un e cl´e ´etra et rang ng``ere er e dans da ns proposer. Comme la colonne numprod apparait apparai t deux de ux fois f ois dans d ans la requˆ re quˆete, ete, il est n´ecessaire ecessaire de la pr´efixer efixer par le nom de la table de sorte que chaque colonne puisse ˆetre etre d´esign´ esign´ee ee de fa¸con con non ambigu¨e. e. Si on veut veu t mettre m ettre face a` face les noms des produits et les noms des fournisseurs, il suffit de saisir la requˆete ete SQL> SELECT nomfo nomfou u , nomp nompro rod d 2 FROM p r od o d u i t , f o u r n i s s e u r , p r o p os os e r 3 WHERE pr od ui t . numP numPro rod d = pr opo ser .numP .numPro rod d 4 AND fo ur ni ss eu r .num .numFou = prop oser .nu .numFou; NOMFOU NOMPROD −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− f1 Rou e d e s e c o u r s f2 P o u p e e Ba t m a n f1 P o u p e e Ba t m a n f3 Cotons t i g e s
1.4.4
Jointures refl´ exives exives
En utilisant la syntaxe suivante, il est possible de rennomer les tables, FROM < t a b l e 1 > < t a b l e 1 r e n o m m e e > , . . . , < t a b l e n > < t a b l e n r e n o m m e e >
Reformulons Reformulon s la requˆete ete ci-dessus, ci-dessu s, SQL> SELECT nomfo nomfou u , nomp nompro rod d 2 FROM p ro r o du d u it i t p , f o u r n i s s eu e u r f , p ro r o po p o se se r p r 3 WHERE p.numProd = pr .numProd 4 AND f .numFo .numFou u = pr . numF numFou; ou; NOMFOU NOMPROD −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− f1 Rou e d e s e c o u r s f2 P o u p e e Ba t m a n f1 P o u p e e Ba t m a n f3 Cotons t i g e s Le renommage permet entre autres de faire des jointures r´ eflexives, eflexives, c’est `a dire entre une table et elle mˆeme. eme. Par exemple, en reprenant la table intervalle, SQL> SELECT ∗ FROM i n t e r v a l l e ; BORNEINF BORNE INF BORN BO RNES ESUP UP −−−−−−−−−− −−−−−−−−−− 0 30 2 3 2 56 5 10 7 32 8 27 12 3 12 30 21 8 34 26 10 lign e ( s ) sele ctio nnee ( s ). La commande ci-dessous affiche tous les couples d’intervalles ayant une borne en commun, SQL> SELECT ∗ FROM i n t e r v a l l e i , i n t er er v al l e j 2 WHERE ( i . b o r n e I n f = j . b o r n e I n f OR i . borneSup = j . borneSup) 3 AND i . rowid <> j . rowid ; 15
BORNEI BORN EINF NF BORNESUP BORN BO RNEI EINF NF BORNESUP −−−−−−−−−− −−−−−−−−−− −−−−−−−−−− −−−−−−−−−− 0 30 12 30 2 3 2 56 2 3 12 3 2 56 2 3 12 3 2 3 12 3 12 30 12 30 0 30 12 30 12 3 8 lign e ( s ) selec tion nee ( s ). Que ceux qui ont du courage reformulent reformulent la requˆ ete ete sans utiliser le rowid !
16
1.5
Agr´ egation egat ion de donn´ do nn´ ees ees
1.5.1
Fonctions d’agr´ egation egation
Exemple introductif
Nous voulons connaˆ connaˆıtre le nombre de lignes de table produit . Deux fa¸cons cons de proc´ pro c´eder eder : 1. Solution moche SQL> SELECT ∗ FROM PRODUI PRODUIT T; NUMPROD NOMPROD −−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 1 Roue d e s e c o u r s 2 Poupee Ba Batm tman an 3 C ot ot on on s t i g e s 4 C o rn r n i c ho ho n s 4 lign e ( s ) sele ctio nnee ( s ). On a la r´eponse epo nse avec le nombre nombr e de lignes lig nes s´electio elec tionn´ nn´ees. ees. 2. Solution belle SQL> SELECT co un PRODUIT; untt ( ∗ ) FROM PRODUIT; COUNT( ∗ )
−−−−−−−−−− 4 1 l i g n e s e l ec e c t i o nn nn e e . La r´eponse ep onse est le r´esultat esul tat de la requˆete. ete. D´ efini efi niti tion on
Une fonction d’agr´ egation egation retourne une valeur valeur calcul´ ee ee sur toutes les lignes de la requˆ ete ete (nombre, moyenne...). moyenne...). Nous allons utiliser les suivantes : – COUNT(col) : retourne le nombre de lignes dont le champ col est non NULL. – AVG(col) : retourne la moyenne des valeurs col sur toutes les lignes dont le champ col est non NULL. – MAX(col) : retourne la plus grande des valeurs col sur toutes les lignes dont le champ col est non NULL. – MIN(col) : retourne la plus petite des valeurs col sur toutes les lignes dont le champ col est non NULL. – SUM(col) : retourne la somme des valeurs col sur toutes les lignes dont le champ col est non NULL. Exemples d’utilisation
L’exemple suivant retourne le prix du produit propos´e au prix maximal. SQL> SELECT MAX( pri x ) 2 FROM PROPOSER PROPOSER;; MAX(PRIX) −−−−−−−−−− 20 0
1 l i g n e s e l ec e c t i on on n e e . Il est possible de renommer la colonne MAX(prix), en utilisant utilis ant le mot cl´e AS : SQL> SELECT MAX( pri x ) AS PRIX MAXIMAL 2 FROM PROPOSER PROPOSER;; PRIX MAXIMAL −−−−−−−−−−−− 20 0 17
1 l i g n e s e l ec e c t i on on n e e . Les requˆetes etes suivantes sui vantes r´ecup` ecup`erent erent le nom du fournis fou rnisseur seur proposant prop osant l’articl l’ar ticlee ’Poup´ ’ Poup´ee ee Batman’ Bat man’ au prix pri x le l e moin m oinss ´elev´ elev´e : SQL> SELECT MIN( pri x ) AS PRIX MINIMUM 2 FROM PROP PROPOS OSER ER PR, PR , PROD PRODUIT UIT P 3 WHERE PR. numpr numprod od = P. numpr numprod od 4 AND nompro nomprod d = ’ Poupee Ba Batm tman an ’ ; PRIX MINIMUM −−−−−−−−−−−− 1 1 l i g n e s e l ec e c t i on on n e e . SQL> SELECT nomfou 2 FROM FOUR FOURNIS NISSE SEUR UR F , PROP PROPOS OSER ER PR, PROD PRODUI UIT T P 3 WHERE F. numfou numfou = PR. numfou 4 AND PR. numprod numprod = P. numprod numprod 5 AND nompro nomprod d = ’ Poupee Ba Batm tman an ’ 6 AND p r i x = 1 ; NOMFOU −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− f2 1 l i g n e s e l ec e c t i on on n e e . Il est possib pos sible le de d e faire fa ire cela avec une u ne seule seul e requˆ re quˆete ete en r´ecup´ ecup´erant erant le prix minimum mini mum dans une requˆete ete imbriqu´ imbri qu´ee. ee. Mais cela sera pour un cours co urs ult´ u lt´erieur. erieur. Compl´ Com pl´ ements eme nts sur COUNT
On r´ecup` ecup`ere ere le nombre de ligne retourn´ees ees par une requˆete ete en utilisant utilisa nt COUNT(*). Par exemple, si on souhaite connaˆıtre ıtre le nombre n ombre de produits produ its propos´ propo s´es es par pa r le fournisseur fournis seur ’f1’ ’ f1’ : SQL> 2 3 4
SELECT COUNT( ∗ ) AS NB PROD FROM FOURNIS FOURNISSEUR SEUR F , PROP PROPOS OSER ER P WHERE F. numfou = P. numfou AND nomfou nomfou = ’ f1 ’ ;
NB PROD −−−−−−−−−− 2 1 l i g n e s e l ec e c t i on on n e e . On aurait aussi pu saisir : SQL> 2 3 4
SELECT COUNT(numprod) AS NB PROD FROM FOURNIS FOURNISSEUR SEUR F , PROP PROPOS OSER ER P WHERE F. numfou = P. numfou AND nomfou nomfou = ’ f1 ’ ;
NB PROD −−−−−−−−−− 2 1 l i g n e s e l ec e c t i on on n e e . Pour connaˆ c onnaˆıtre ıtr e le nombre n ombre de prod pr oduit uitss propos´ pro pos´es, es, c’est c ’est `a dire dont le numprod a une occurence dans la table PROPOSER, on proc`ede ede de la fa¸con con suivante :
18
SQL> SELE SELECT CT COUNT(DISTINCT numprod) AS NB PRODUITS PROPOSES 2 FROM PROPOSER PROPOSER;; NB PRODUITS PROPOSES −−−−−−−−−−−−−−−−−−−− 3 1 l i g n e s e l ec e c t i on on n e e . Le DISTINCT nous sert `a ´eviter eviter qu’un mˆeme eme produit prod uit propos´ propo s´e par des fournisseurs fourniss eurs diff´erents erents soit comptabilis´ comptab ilis´e plusieurs fois.
1.5.2 1.5.2
Grou Groupa page ge
GROUP BY L’instruction GROUP
Les Le s op´erati era tion on d’agr´ d’a gr´egat eg ation ion consi con sid´ d´er´ er´ees ees jusq ju squ’ u’``a maintenant p ortent sur la totalit´e des lignes retourn´ ees ees par les requˆetes, etes , l’instru l’in structi ction on GROUP l ’int´ nt´erieu eri eurr desq d esque uels ls les le s don d onn´ n´ees ees seron se rontt agr´ a gr´eg´ eg´ees. ees . Cet C ette te GROUP BY permet de former des paquets `a l’i instruction instru ction s’utilise s’util ise de la mani` man i`ere ere suivante sui vante SELECT . . . FROM . . . WHERE. . . GROUP BY < l i s t e c o l o n n e s > ORDER BY . . .
La liste des colonnes colonnes sert de crit` crit`ere ere pour r´ epartir epartir les lignes lignes dans des paquets paquets de lignes. lignes. Si par exemple exemple nous souhaitons afficher la liste des nombres de pro duits propos´ prop os´ es es par chaque fournisseur : SQL> SELECT nomfou , COUNT(DISTINCT numprod) AS NB PRODUITS PROPOSES 2 FROM FOUR FOURNIS NISSE SEUR UR F , PROP PROPOS OSER ER P 3 WHERE F. numfou = P. numfou 4 GROUP BY nomfou ; NOMFOU NB PRODUITS PROPOSES −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−− f1 2 f2 1 f3 1 3 lign e ( s ) selec tion nee ( s ). L’instruction HAVING
Supposons Supposons que de la requˆ requˆete ete pr´ ec´ ec´ edente, edente, nous ne souhaition souhaitionss garder garder que les lignes lignes pour lesquelles lesquelles la valeur es t ´egal eg alee `a 1. Ajouter une condition dans WHERE serait inutile, le filtrage filt rage occasionn´ o ccasionn´e par WHERE NB PRODUITS PROPOSES est est effectu´e avant avant l’agr´egation. egation . Il nous faudrait faudrai t une instruction instruc tion pour n’inclure n’incl ure que des groupes group es de donn´ees ees r´epondant epond ant certains certain s crit`eres. eres. L’instruction L’inst ruction utilis´ee ee pour ce faire est HAVING. Son utilisation est la suivante : SELECT . . . FROM . . . WHERE . . . GROUP BY . . . HAVING < c o n d i t i o n > ORDER BY . . .
Par exemple, SQL> SELECT nomfou , COUNT(DISTINCT numprod) AS NB PRODUITS PROPOSES 2 FROM FOUR FOURNIS NISSE SEUR UR F , PROP PROPOS OSER ER P 3 WHERE F. numfou = P. numfou 4 GROUP BY nomfou 5 HAVING COUNT(DISTINCT nump numpro rod) d) = 1
19
6
ORDER BY nomfou DESC ;
NOMFOU NB PRODUITS PROPOSES −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−− f3 1 f2 1 2 lign e ( s ) selec tion nee ( s ). Affichons les noms des fournisseurs qui ont livr´e strictement plus d’un produit diff´ erent erent (toutes livraisons confondues), SQL> SELECT nomfou 2 FROM FOUR FOURNI NISS SSEU EUR R F , DETAILL DETAILLIVR IVRAISO AISON N D 3 WHERE F. numfou numfou = D. numfou 4 GROUP BY nomfou 5 HAVING count (DISTINCT D. numpr numprod) od) > 1 ; NOMFOU −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− f1 1 l i g n e s e l ec e c t i on on n e e .
20
1.6
Vues
1.6.1
D´ efinition efinitio n
Une vue v ue est es t une un e table ta ble contenant c ontenant des donn´ d onn´ees ees calcul´ ca lcul´ees ees sur s ur celle cel le d’une d ’une autre table. Les donn´ees ees d’une d ’une vue sont tout t out le temps `a jour. Si vous modifiez les donn´ees ees d’une des tables sur lesquelles est calcul´ee ee la vue, alors les modifications mo difications sont automatiquement automat iquement r´epercut´ epercu t´ees ees sur la vue.
1.6.2 1.6.2
Syn Syntaxe taxe
Appr´ App r´eciez ecie z la l a simp s implici licit´ t´e de d e la l a synta s yntaxe xe : CREATE VIEW AS < r e q u e t e >
1.6.3 1.6.3
Appl Applic icat atio ion n
Par exemple, la requˆ ete ete suivante met en correpondance les noms des produits avec le nombre de fournisseurs qui le proposent : SQL> 2 3 4 5 6
SELECT nomprod , COUNT(numfou) AS NB FOURNISSEURS FROM PRODUIT PRODUIT P PROPOSER ER PR LEFT OUTER JOIN PROPOS ON P. numprod numprod = PR. PR. numprod numprod nomprod GROUP BY ORDER BY COUNT( numfou numfou ) ;
NOMPROD NB FOURNISSEURS −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−− Cornichons 0 Cotons t i g e s 1 Roue d e s e c o u r s 1 P o u p e e Batman 2 4 lign e ( s ) selec tion nee ( s ). Ce type de requˆ ete ete sera explit´e dans un cours ult´ erieur. erieur. Pour le moment, notez juste que les outils dont vous disposez disposez pour le moment moment ne vous permettront permettront pas de formuler formuler une requˆ requˆete ete affic affichant hant les noms des produits produits n’ayan n’ayantt aucun fournisseur. f ournisseur. Cr´eons eons une vue pour ne pas avoir `a se farcir la requˆ ete ete chaque fois que nous aurons besoin de ces informations : SQL> 2 3 4 5 6 7
CREATE VIEW NB FOURNISSEURS PAR PRODUIT AS SELECT nomprod , COUNT(numfou) AS NB FOURNISSEURS PRODUIT P FROM PRODUIT PROPOSER ER PR LEFT OUTER JOIN PROPOS numprod = PR. PR. numprod numprod ON P. numprod nomprod GROUP BY ORDER BY COUNT( numfou numfou ) ;
Vue c r e e e . Une fois cr´e´ e´ee, ee, on peut interroger une vue de la mˆeme eme fa¸con con qu’on interroge une table : SQL> SELECT ∗ 2 FROM NB FOURNISSEURS FOURNISSEURS PAR PRODUIT PRODUIT;; NOMPROD NB FOURNISSEURS −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−− Cornichons 0 Cotons t i g e s 1 Roue d e s e c o u r s 1 P o u p e e Batman 2 4 lign e ( s ) selec tion nee ( s ). 21
Notez que toute modification dans la table PROPOSER ou PRODUIT sera ser a imm´ i mm´ediat ed iateme ement nt r´eperc ep ercut´ ut´ee ee sur su r la l a vue. v ue. SQL> INSERT INTO PROPOSER VALUES ( 3 , 4 , 9 ) ; 1 l i g n e c re r e ee ee . SQL> SELECT ∗ 2 FROM NB FOURNISSEURS FOURNISSEURS PAR PRODUIT PRODUIT;; NOMPROD NB FOURNISSEURS −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−− Cornichons 1 Cotons t i g e s 1 Roue d e s e c o u r s 1 P o u p e e Batman 2 4 lign e ( s ) selec tion nee ( s ). Maintenant, nous souhaitons voir s’afficher, pour tout i, le nombre de produits propos´es es par exactement i fournisseurs. SQL> SET h e a d o f f SQL> SELECT ’ I l y a ’ | | COUNT(NOMPROD) | | ’ p r od o d u it i t ( s ) q ui ui e s t / s o n t ’ | | 2 ’ p r op o p o se s e ( s ) p ar a r ’ | | NB FOURNISSEURS | | ’ f o u r n i s s e u r ( s ) . ’ 3 FROM NB FOURNISSEURS PAR PRODUIT 4 GROUP BY NB FOURNISSEURS 5 ORDER BY NB FOURNISSE FOURNISSEURS URS;; I l y a 3 p r od o d u i t ( s ) q u i e s t / s o n t p ro r o po p o se s e ( s ) p ar ar 1 f o u r n i s s e u r ( s ) . I l y a 1 p r od o d u i t ( s ) q u i e s t / s o n t p ro r o po p o se s e ( s ) p ar ar 2 f o u r n i s s e u r ( s ) . 2 lign e ( s ) selec tion nee ( s ). SQL> SET head on
1.6.4 1.6.4
Supp Su ppre ress ssio ion n
On supprime une vue avec l’instruction suivante : DROP VIEW ;
22
1.7 1.7
Requˆ Req uˆ etes ete s imbriqu´ imbr iqu´ees ees
Oracle permet p ermet d’imbriquer d ’imbriquer les requˆetes, etes, c’est-` c ’est-`a-dire a-d ire de placer plac er des requˆetes etes dans dan s les requˆetes. ete s. Une requˆete ete imbriqu´ imbri qu´ee ee peut renvoyer trois types de r´esultats esultat s : – une valeur valeur scalaire scalaire – une colonne colonne – une table
1.7.1
Sous requˆ etes etes renvoy renvoyant ant une valeur valeur scalaire
Le r´ esultat esultat d’une requˆ ete ete est dit scalaire s’il comporte une seule ligne et une seule colonne. Par exemple : SQL> SELE PERSONNE;; SELECT CT COUNT( ∗ ) FROM PERSONNE COUNT( ∗ )
−−−−−−−−−− 21 On peut placer dans une requˆete ete une sous-requˆ sous-req uˆete ete calculant calcula nt un r´esultat esultat scalaire. scalaire . Un tel type de sous-requˆ sous-req uˆete ete se place p lace soit comme une colonne suppl´ementaire, ementaire, soit comme une valeur servant servant `a ´evaluer evaluer des conditions conditi ons (WHERE ou HAVING ). Colonne fictive
On peut ajouter une colonne colonne dans une requˆ requˆete, ete, et choisir choisir comme valeurs valeurs pour cette colonne le r´ esultat esultat d’une requˆete. ete. Ce type de requˆete ete est souvent une alternative alterna tive `a GROUP ete ete suivante suivante nous renvoie, renvoie, GROUP BY. Par exemple, la requˆ pour tout produit, le nombre de fournisseurs proposant ce produit : SQL> SELECT nompr nomprod od , (SELE SELECT CT COUNT( ∗ ) FROM PROPOS 2 PROPOSER ER PR 3 numprod od = P . numpr numprod) od) WHERE PR. numpr AS NB FOURNISSEURS 4 5 FROM PROD PRODUI UIT T P; NOMPROD NB FOURNISSEURS −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−− Roue d e s e c o u r s 1 P o u p e e Batman 2 Cotons t i g e s 1 Cornichons 0 Conditions complexes
On peut p eut construi c onstruire re une condition conditi on en utilisant utilis ant le r´ esultat esultat d’une requˆete. ete. Pour notre not re exemple, exe mple, d´eclarons eclarons d’abord d’ab ord une un e vue contenant contenant le nombe d’articles propos´ prop os´es es par chaque fournisseur, SQL> CREATE VIEW NB PROD PAR FOU AS SELECT CT COUNT( ∗ ) 2 SELECT numf numfou ou , (SELE 3 PROPOSER ER P FROM PROPOS WHERE P. numfou 4 numfou = F. numf numfou) ou) 5 AS NB PROD 6 FROM FOUR FOURNIS NISSE SEUR UR F ; Vue c r e e e . Ensuite, recherchons les noms des fournisseurs proposant le plus de produits : SQL> SELECT nomfou 2 FROM FOUR FOURNI NISS SSEU EUR R F , NB PRO PROD D PAR PAR FOU FOU N 3 WHERE F. numfou numfou = N. numfou 4 AND NB PROD = (SELECT MAX(NB PROD) FROM NB PROD 5 PROD PAR PAR FOU FOU ) ; NOMFOU 23
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− f1 La requ re quˆˆete et e SELECT evalu´ evalu´ee ee avant, et son r´esultat esul tat lui est substi sub stitu´ tu´e dans dan s SELECT MAX(NB MAX(NB PROD) PROD) FROM FROM NB PROD PROD PAR FOU est ´ l’expression l’expres sion de la requˆete. ete. Comme on a SQL> SELECT MAX(NB PROD) FROM NB PROD PROD PAR FOU; FOU ; MAX(NB PROD)
−−−−−−−−−−−− 2 Alors Alo rs la requˆete ete pr´ec´ ec´edente, edent e, dans dan s ce contexte conte xte,, est ´equivalente equi valente `a SQL> SELECT nomfou 2 FROM FOUR FOURNI NISS SSEU EUR R F , NB PRO PROD D PAR PAR FOU FOU N 3 WHERE F. numfou numfou = N. numfou 4 AND NB PROD = 2 ; NOMFOU −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− f1 INSERT et UPDATE
On peut placer dans des instructions de mises `a jour ou d’insertions d’insert ions des requˆetes etes imbriqu´ees. ees. Par exemple, exe mple, SQL> INSERT INTO PERSONNE ( numpers , nom nom , prenom ) 2 VALUES ( (SELECT MAX( n u m p e r s ) + 1 FROM PERSONNE) , 3 ’ Da D a r t h ’ , ’ Va V ad or ’ ) ; 1 l i g n e c re r e ee ee . > SQL UPDATE PERSONNE SET 2 p e r e = (SELECT numpers FROM PERSONNE 3 4 WHERE nom = ’ Socr ate ’ AND pren 5 prenom om IS NULL) , 6 m e r e = (SELECT numpers FROM PERSONNE 7 8 Fabian ’ WHERE nom = ’ Fabian AND pren 9 prenom om = ’ Lara ’ ) 10 WHERE numpers = (SELECT numpers FROM PERSONNE 11 12 WHERE nom = ’ Darth ’ AND pren 13 prenom om = ’Vador ’ ) ; 1 l i g n e m is is e a j o ur ur .
1.7.2
Sous requˆ etes etes renvoy renvoyant ant une colonne
On consid`ere ere une colonne comme une liste de valeurs, valeur s, on o n peut p eut tester l’appartance l’appart ance d’un ´el´ el´ement ement `a cette liste `a l’aide de l’op´ l’ op´erate era teur ur IN. On peut s’en servir comme une alternative aux jointures, par exemple, r´ e´ eecrivons e´crivons la requˆ ete ete de la section pr´ec´ ec´edente. edente. La requˆete ete suivante nous renvoie le nombre de produits prod uits propos´ propo s´es es par les fournisseurs fourniss eurs proposant propo sant le plus de produits : SQL> SELECT MAX(NB PROD) FROM NB PROD PROD PAR FOU; FOU ; MAX(NB PROD)
−−−−−−−−−−−− 2 Maintenant, Maintenant, recherchons recherchons les num´eros eros des fournisseurs proposant un tel nombre de produits :
24
SQL> SELECT N. numfou 2 FROM NB PROD PROD PAR PAR FOU N 3 WHERE NB PROD = (SELECT MAX(NB PROD) FROM NB PROD 4 PROD PAR PAR FOU FOU ) ; NUMFOU −−−−−−−−−− 1 Notons que s’il existe existe plusieurs plusieurs fournisseu fournisseurs rs proposant proposant 2 produits, produits, cette requˆ requˆete ete renver renverra ra plusieurs plusieurs lignes. lignes. C’est C’est donc par hasard qu’elle ne retourne qu’une ligne. Le num´ero ero du fournisseur proposant le plus de produits est donc le 1. Cherchons ce fournisseur : SQL> SELECT nomfou 2 FROM FOURNIS FOURNISSEU SEUR R F 3 WHERE F. numfou IN ( 1 ) ; NOMFOU −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− f1 Il suffit donc dans la requˆ ete ete ci-dessous de remplacer le 1 par la requˆ ete ete qui a retourn´ e 1. On a finalement : SQL> SELECT nomfou 2 FROM FOURNIS FOURNISSEU SEUR R F 3 WHERE F. numfou IN (SELECT N. numfou 4 PROD PAR PAR FOU N FROM NB PROD 5 NB P R O D = (SELECT MAX(NB PROD) WHERE 6 PROD D PAR PAR FOU FOU)) ) ; FROM NB PRO NOMFOU −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− f1
1.7.3
Sous requˆ etes etes non n on correl´ cor rel´ ees ees renvo r envoyant yant une table tab le
On peut remplacer le nom d’une table dans la clause FROM par une sous-requˆ sous-req uˆete. ete. Par exemple, la requˆete ete suivante renvoie une table. SQL> SELECT 2 (SELE SELECT CT COUNT( ∗ ) FROM PROPOS 3 PROPOSER ER PR 4 numfou WHERE PR. numfou = F. numfou 5 ) AS NB PROD 6 FROM FOUR FOURNIS NISSE SEUR UR F ; NB PROD −−−−−−−−−− 2 1 1 0 Cette table contient, pour chaque fournisseur, le nombre de produits propos´es. es. Si l’on souhaite connaˆıtre ıtre le plus grand nombre de produits pro duits propos´ propo s´es, es, on o n se sert du r´esultat esultat de la l a requˆ req uˆ ete ete ci-dessus ci-dessu s comme com me d’une d ’une table : SQL> SELECT MAX(NB PROD) AS MAX NB PROD 2 FROM 3 (SELECT 4 (SELE SELECT CT COUNT( ∗ ) 5 PROPOSER PR FROM PROPOSER 6 numfou WHERE PR. numfou = F. numfou 7 ) AS NB PROD 25
8 9
FOURNISSEU SEUR R F FROM FOURNIS );
MAX NB PROD −−−−−−−−−−− 2 Ce type de requˆ ete ete est une alternative aux vues. R´ ecup´ ecup´ erons erons maintenant maintenant les noms des fournisseurs proposant le plus de produits (sans (sans jointure jointure et sans vue !) : SQL> SELECT nomfou 2 FROM FOURNISSEUR 3 WHERE numfou IN 4 (SELECT numfou FROM 5 6 (SELECT numfou , SELECT CT COUNT( ∗ ) 7 (SELE 8 PROPOSER ER PR FROM PROPOS 9 WHERE PR. numfou = F . numfou 10 ) AS NB PROD 11 FOURNISSEUR EUR F FROM FOURNISS 12 ) N 13 PROD D = WHERE NB PRO 14 (SELECT MAX(NB PROD) 15 FROM 16 (SELECT numfou , 17 (SELE SELECT CT COUNT( ∗ ) FROM PROPOSER 18 PROPOSER PR 19 numfou WHERE PR. numfou = F. numfou 20 ) AS NB PROD 21 FOURNISSEUR SEUR F FROM FOURNIS 22 ) N 23 ) 24 ); NOMFOU −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− f1 Vous constatez que la solution utilisant les vues est nettement plus simple.
1.7.4 1.7 .4
Sous requˆ re quˆ etes etes correl´ cor rel´ ees ees
Une sous-requˆ sous-re quˆete ete peut ˆetre etre de deux types : – simple : Elle Ell e ´evalu´ eval u´ee ee avant la requˆ req uˆete et e prin pr incip cipal alee co rre el´ ee : Elle – corr E lle est ´evalu´ evalu´ee ee pour po ur chaque chaqu e lign l ignee de d e la l a requˆ r equˆete ete princip pri ncipale ale Par exemple, la requˆ ete ete suivante suivante renvoie renvoie le nombre de produits livr´es es pour chaque fournisseur. Elle contient une sousso us-re requˆ quˆete et e correl cor rel´´ee. ee. SQL> SELECT numfou , 2 (SELECT SUM( qte ) FROM DETAILLIVRAIS 3 DETAILLIVRAISON ON D 4 WHERE D. numfou = F. numfou 5 ) NB PROD L 6 FROM FOUR FOURNIS NISSE SEUR UR F ; NUMFOU NB PROD L −−−−−−−−−− −−−−−−−−−− 1 45 2 3 10 4 26
Cette Cet te mˆeme eme requˆete, ete, une fois foi s ´evalu´ evalu´ee, ee, peut peu t server serve r de requˆete ete non correl´ corr el´ee ee si on souhait souh aitee conna conn aˆıtre ıtr e les noms de ces fournisseurs : SQL> SELECT nomfo u , NB PROD PROD L 2 FROM FOUR FOURNIS NISSE SEUR UR F , 3 (SELECT numfou , 4 (SELECT SUM( qte ) 5 DETAILLIVRAISON ON D FROM DETAILLIVRAIS WHERE D. numfou = F. numfou 6 7 ) NB PROD L FROM FOURNISS 8 FOURNISSEUR EUR F 9 ) L 10 WHERE F. numfou numfou = L . numfou ; NOMFOU NB PROD L −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−− f1 45 f2 f3 10 f4 Amusons-nous Amusons-n ous : quel sont, pour chaque fournisseur, fourniss eur, les produ p roduits its qui ont o nt ´et´ et´e les plus livr´es es ? SQL> SELECT nomfou , nomprod nomprod 2 FROM FOUR FOURNI NISS SSEU EUR R F , PRODU RODUIT IT P , 3 (SELECT FF. numfou numfou , PP. numprod numprod 4 FOURNIS NISSE SEUR UR FF, FF , PROD PRODUI UIT T PP FROM FOUR WHERE 5 6 (SELECT SUM( qte ) 7 DETAILLIVRAISON ON L FROM DETAILLIVRAIS 8 numfou WHERE L . numfou = FF. numfou 9 AND L.numprod = PP.numprod 10 ) 11 = 12 (SELECT MAX(NB PROD L) 13 FROM 14 (SELECT numfou , SUM( qte ) AS NB PROD L 15 DETAILLIVRAISON N L FROM DETAILLIVRAISO GROUP BY numpro 16 numprod d , numfou 17 ) Q WHERE Q. numfou = FF. numfou 18 numfou 19 ) GROUP BY numfou 20 numfou , numprod numprod 21 ) M 22 WHERE M. numpr numprod od = P. numpr numprod od 23 AND M. numfou = F . numfou ; NOMFOU NOMPROD −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− f1 Rou e d e s e c o u r s f3 Cotons t i g e s Dans Dan s la l a requˆ r equˆete ete pr´ec´ ec´edente, edent e, quelles quel les sous-req sous -requˆ uˆetes etes sont correl´ corr el´ees ees et lesquel les quelles les ne le sont pas ?
27
1.8 1.8.1
Compl´ ements ements sur les types Types num´ num´ eriques eriques
efinit efinit un type num´erique erique de au plus ( p − s) chiffres avant la virgule et au plus s chiffres chiffr es apr`es es la NUMBER(p, NUMBER(p, s) d´ virgule. SQL> CREATE TABLE TOTO 2 ( t ut ut u number ( 4 , 2 ) 3 ); Table c r e e e .
SQL> INSERT INTO TOTO VALUES( 1 0 . 2 ) ; 1 l i g n e c re r e ee ee . SQL> INSERT INTO TOTO VALUES( 1 0 ) ; 1 l i g n e c re r e ee ee . SQL> INSERT INTO TOTO VALUES ( . 0 1 ) ; 1 l i g n e c re r e ee ee . SQL> INSERT INTO TOTO VALUES( 2 1 . 0 1 ) ; 1 l i g n e c re r e ee ee . SQL> INSERT INTO TOTO VALUES( 2 1 . 0 ) ; 1 l i g n e c re r e ee ee . SQL> INSERT INTO TOTO VALUES( 2 1 . 0 1 2 ) ; 1 l i g n e c re r e ee ee . SQL> INSERT INTO TOTO VALUES( 3 2 1 . 0 ) ; INSERT INSE RT INTO TOTO VALUES( 3 2 1 . 0 ) ∗ ERREUR a l a l i g n e 1 : ORA− 0 1144 338 8 : v a l e u r i n c o he h e r e nt n t e a ve v e c l a p r e c i s i o n i n d iq i q u e e p ou o u r c e t t e c o lo l o nn nn e
SQL> INSERT INTO TOTO VALUES( 3 2 1 ) ; INSERT INTO TOTO VALUES( 3 2 1 ) INSERT ∗ ERREUR a l a l i g n e 1 : ORA− 0 1144 338 8 : v a l e u r i n c o he h e r e nt n t e a ve v e c l a p r e c i s i o n i n d iq i q u e e p ou o u r c e t t e c o lo l o nn nn e
Une petite p etite liste de propri´ pr opri´et´ et´es es et de fonction f onctionss qui peuvent servir : – Pour concat´ conc at´ener ener deux deu x chaˆ chaˆınes de caract` cara ct`eres, eres , on utilis uti lisee l’op´ l ’op´erateur erat eur || – Il est aussi possible p ossible de comparer deux chaines de caract` eres eres avec >, l’ordre consid´er´ er´e est l’ordre ”dictionnaire” ”dictio nnaire” (ou lexicographique). – La longueur s’obtient s’obtient avec avec la fonction fonction LENGTH. – On extrait une sous-chaine de caract` eres eres de longueur l a` partir de l’indice i (les indices commencent `a 1) de la chaˆ ch aˆıne s avec la fonction SUBSTR SUBSTR(S, (S, i, l). Par exemple, SUBSTR SUBSTR(’o (’orac racle’ le’, , 3, 2) = ’ac’ ’ac’ – UPPER convertit en majuscules, LOWER convertit en minuscules.
1.8. 1.8.3 3
Types ypes date date
Une date en SQL est consid´ er´ er´ e comme un point dans le temps. On le convertit convertit en chaine de carat` eres eres avec la fonction to char(date, u format est une chaˆ chaˆıne de caract`eres eres optionnelle. optionn elle. Par exemple, char(date, format) format), o` SQL> SELECT t o c h a r ( d a t e l i ) AS DT 2 FROM LIVRAISON LIVRAISON;; DT −−−−−−−− 30/10/06 30/10/06 SQL> SELECT t o c h a r ( d a t e l i , 2 FROM LIVRAISON LIVRAISON;; ANNE −−−− 2006 2006 SQL> SELECT to ch ar ( da t el i , 2 FROM LIVRAISON LIVRAISON;; DT −−−−−−−−−− 2006/10/30 2006/10/30 SQL> SELECT to ch ar ( da t el i , 2 FROM LIVRAISON LIVRAISON;;
’ y yy y y y ’ ) AS ANNEE
’ yyyy/ yyyy/m mm/dd ’ ) AS DT
’yyy ’yyyymmdd ’ ) AS DT
DT −−−−−−−− 20061030 20061030 On convertit convertit une chaine de caract` eres eres en date avec la fonction to date(date, date(date, format) format). Par exemple : SQL> UPDATE LIVRAISON 2 SET d a t e l i = t o d a t e ( ’ 1 9 34 34 ’ | | to ch ar ( da te li , ’mm ’mmdd’ ) , ’yy ’yyyymmdd ’ ) ; 2 l i g n e ( s ) m is is e ( s ) a j o u r . SQL> SELECT ∗ 2 FROM LIVRAISON LIVRAISON;; NUMFOU
NUMLI DAT DATELI 29
−−−−−−−−−− −−−−−−−−−− −−−−−−−− 1 1 30/10/34 3 1 30/10/34 SQL> UPDATE LIVRAISON 2 SET d a t e l i = t o d a t e ( ’ 2 0 06 06 ’ | | to ch ar ( da te li , ’mm ’mmdd’ ) , ’yy ’yyyymmdd ’ ) ; 2 l i g n e ( s ) m is is e ( s ) a j o u r . SQL> SELECT ∗ FROM LIVRAISON LIVRAISON;; NUMFOU NUMLI −−−−−−−−−− −−−−−−−−−− 1 1 3 1
1.8.4 1.8.4
DAT DATELI −−−−−−−− 30/10/06 30/10/06
La foncti fonction on inclas inclassab sable le
nvl(valeur1, valeur2) renvoie valeur1 si valeur1 est non NULL, valeur2 sinon. Par exemple,
SQL> DELETE FROM TOTO; 6 l i g n e ( s ) s u p p r im im e e ( s ) . SQL> SELECT SUM( tutu ) 2 FROM TOTO; SUM(TUTU)
La contrainte d´eclarative eclarative de type permet p ermet de tester une condition p ortant les lignes de la table prises une par une. La syntaxe est : ALTER TABLE nomtable ADD CONSTRAINT n o m c o n t r a i n t e CHECK( c o n d i t i o n ) ;
Par exemple, SQL> ALTER TABLE EMP ADD CONSTRAINT c k s a l a ry r y CHECK(SAL > 0 ) ; Table m o d i f i e e .
SQL> INSERT INTO EMP (EMP (EMPNO, SAL) SAL ) VALUES (15 , − 1 ) ; (EMPNO, SAL) SAL ) VALUES (15 , −1) INSERT INSE RT INTO EMP (EM ∗ ERREUR a l a l i g n e 1 : ORA− 0 22 22 90 9 0 : v i o l a t i o n d e c o n t r a i n t e s (SCOTT . CK CK SALARY ) d e v e r i f i c a t i o n Une contrainte de type CHECK ne peut p eut pas contenir de requˆ etes etes ni de valeurs non constantes (sysdate par exemple).
30
1.9 1.9
Intr Introdu oduct ctio ion n au PL/S PL/SQL QL
1.9. 1.9.1 1
PL/S PL/SQL QL
Le PL de PL/SQL signifie Procedural Language. Il s’agit d’une extension proc´edurale edurale du SQL permettant d’effectuer des traitements complexes sur une base de donn´ ees. ees. Les possibilit´es es offertes sont les mˆ emes emes qu’avec qu’avec des langages imp´eratifs eratifs (instructions (instr uctions en s´equence) equence) classiques. classiqu es. Ecrivez-le dans un ´editeur editeur dont vous copierez le contenu contenu dans SQL+. Un script ´ecrit ecrit en PL/SQL se termine obligatoirement par un /, sinon SQL+ ne l’interpr`ete ete pas. S’il contient des erreurs de compilation, il est possible p ossible d’afficher les messages d’erreur avec la commande SQL+ : SHOW ERRORS ERRORS.
1.9. 1.9.2 2
Bloc Blocss
Tout code cod e ´ecrit ecrit dans un langage proc´edural edural est form´e de d e blocs. b locs. Chaque bloc comprend une section de d´eclaration eclarati on de variables, variable s, et un ensemble en semble d’instruc d’ instructions tions dans lequel l equel les variables variable s d´eclar´ eclar´ees ees sont visibles. visibl es. La syntaxe est DECLARE / ∗ d e c l ar a r a t i on o n d e v a r i a b l e s ∗ / BEGIN / ∗ i n s t r u c t i o n s a e x ec e c u te t e r ∗ / END;
1.9.3 1.9.3
Affic Affichage hage
Pour afficher le contenu d’une variable, variable, les proc´edures edures DBMS OUTPUT.PUT() et DBMS OUTPUT.PUT LINE() prennent en argument une valeur `a afficher ou une variable dont la valeur est `a afficher. Par d´ efaut, efaut, les fonctions d’affichage sont desactiv´ desacti v´ees. ees. Il convient, `a moins que vous ne vouliez rien voir s’afficher, de les activer avec la commande SQL+ SET SERVEROU SERVEROUTPUT TPUT ON.
1.9.4 1.9.4
Variabl ariables es
Une variable se d´ eclare eclare de la sorte : nom t yp y p e [ := := i n i t i a l i s a t i o n ] ; L’initisation est optionnelle. Nous utiliserons les mˆemes emes types primitifs que dans les tables. Par exemple : SET SERVEROUTPUT ON
DECLARE c varchar2 ( 1 5 ) : = ’ H e l l o W o rl d ! ’ ; BEGIN DBMS OUTPUT. PUT LINE( c ) ; END;
/ Les affectations se font avec la syntaxe variab variable le := valeur; valeur;
Le IF et le CASE fonctionnent foncti onnent de la mˆeme eme fa¸con con que dans les autres langages imp´eratifs eratifs : IF / ∗ c o n di d i t i o n 1 ∗ / THEN / ∗ i n s t ru r u c t io i o n s 1 ∗ / ELSE
/ ∗ i n s t ru r u c t io i o n s 2 ∗ / END IF ;
voire IF / ∗ c o n di d i t i o n 1 ∗ / THEN / ∗ i n s t ru r u c t io i o n s 1 ∗ / ELSIF / ∗ c o n di d i t i o n 2 ∗ / / ∗ i n s t ru r u c t io i o n s 2 ∗ / 31
ELSE
/ ∗ i n s t ru r u c t io i o n s 3 ∗ / END IF ;
Les condition co nditionss sont les l es mˆemes emes qu’en qu ’en SQL. SQL . Le switch du langage C s’impl´ emente emente en PL/SQL de la fa¸con con suivante : CASE / ∗ v a r i a b l e ∗ / WHEN / ∗ v a l e u r 1 ∗ / THEN
/ ∗ i n s t ru r u c t io i o n s 1 ∗ / WHEN / ∗ v a l e u r 2 ∗ / THEN / ∗ i n s t ru r u c t io i o n s 2 ∗ / .. . WHEN / ∗ v a l e u r n ∗ / THEN / ∗ i n s t ru r u c t io i o n s n ∗ / ELSE
/ ∗ i n s t r u c t i o n s p ar a r d ´e f a u t ∗ / END CASE;
1.9. 1. 9.6 6
Traiteme Trait ements nts r´ ep´ ep´ etitif eti tifss
perme t d’impl´ d ’impl´ementer ementer les boucles boucl es LOOP LOOP ... END END LOOP LOOP ; permet LOOP / ∗ i n s t r u c t i o n s ∗ / END LOOP; L’instruction EXIT WHEN permet de quitter une boucle. LOOP / ∗ i n s t r u c t i o n s ∗ / EXIT WHEN / ∗ c o n d i t i o n ∗ / ; END LOOP; La boucle FOR existe aussi en PL/SQL : FOR / ∗ v a r i a b l e ∗ / IN / ∗ i n f ∗ / / .. . / ∗ s u p ∗ / LOOP / ∗ i n s t r u c t i o n s ∗ / END LOOP; Ainsi que la boucle WHILE : WHILE / ∗ c o n d i t i o n ∗ / LOOP / ∗ i n s t r u c t i o n s ∗ / END LOOP; Est-il possible, en bidouillant, d’impl´ementer ementer une boucle DO ... WHILE ?
32
1.10 1.10
Tableau ableaux x et struct structure uress
1.10.1 1.10.1
Tableau ableaux x
Cr´ eation eation d’un type tableau
Les types tableau doivent ˆetre etre d´efinis efinis explicitement explici tement par une d´eclaration eclarati on de la forme TYPE / ∗ t y p e ∗ / I S VARRAY ( / ∗ t a i l l e ∗ / / )) OF / ∗ t y p e E l e m e n t s ∗ / / ;; – type est le nom du type tableau cr´ ee ee par cette instruction – taille est le nombre maximal d’´el´ el´ ements ements qu’il est possible de placer dans le tableau. – typeElements est le type des ´el´ el´ ements ements qui vont ˆetre etre stock´ es es dans le tableau, il peut s’agir de n’importe quel type. Par exemple, exe mple, cr´eons eons un type tableau de nombres n ombres indic´e de 1 `a 10, que nous appelerons numberTab TYPE numberTab IS VARRAY ( 1 0 ) OF NUMBER; D´ eclarati ecla ration on d’un tableau tabl eau
Dor´enavant, enavant, le type typ e d’un d’u n tableau tab leau peut pe ut ˆetre etre utilis´ uti lis´e au mˆeme eme titre tit re que NUMBER ou VARCHAR2. Par exemple, exem ple, d´eclarons ecla rons un tableau tab leau appel´ app el´e t de type numberTab, DECLARE TYPE numberTab IS VARRAY ( 1 0 ) OF NUMBER; t numb number erTa Tab b; BEGIN / ∗ i n s t r u c t i o n s ∗ / END;
/ Allocation d’un tableau
La cr´eation eation d’un type tableau met a` disposition dispo sition un constructeur construc teur du mˆeme eme nom que le type cr´e´ e´e. e. Cette fonction fonctio n r´eserve eserve de l’espace l’espac e m´emoire emoire pour ce tableau et retourne retourn e l’adresse l’adress e m´emoire emoire de la zone r´eserv´ eserv´ee, ee, il s’agit d’une sorte de et´ et ´e cr´ cr´ee, ee , la fonc fo ncti tion on numtab() retourne une tableau vide. malloc. Si, par exemple, un type tableau numtab a ´ DECLARE TYPE numberTab IS VARRAY ( 1 0 ) OF NUMBER; t numb number erTa Tab b; BEGIN t := numb number erTa Tab b(); / ∗ u t i l i s a t i o n d u t a bl b l e au a u ∗ / END;
/ Une fois cette allocation faite, il devient presque possible d’utiliser le tableau... Dimensionnement d’un tableau
Le tableau retourn´e par le constructeur construc teur est vide. Il convient ensuite ensuit e de d e r´eserver eserver de l’espace pour stocker les ´el´ements ements qu’il va contenir. On utilise pour cela la m´ ethode ethode EXTEND(). EXTEND s’invoque en utilisant la notation point´ee. ee. Par exemple, DECLARE TYPE numberTab IS VARRAY ( 1 0 ) OF NUMBER; t numb number erTa Tab b; BEGIN t := numb number erTa Tab b(); t .EX .EXTEND( 4 ) ; / ∗ u t i l i s a t i o n d u t a bl b l e au a u ∗ / END;
/
33
Dans cet exemple, t.EXTEND( d’util iser les ´el´ el´ements ements du tableau t(1), t(2), t(3) et t(4). t.EXTEND(4) 4) ; permet par la suite d’utiliser Il n’est pas possible ”d’´ etendre” etendre” un tableau a` une taille sup´erieure erieure `a celle cell e sp´ s p´ecifi´ ecifi´ee ee lors lor s de d e la l a cr´eation eati on du type typ e tableau tab leau asso as soci ci´´e. e. Utilisation d’un tableau
On acc`ede, ede, en lecture et en ´ecriture, ecritur e, au i-`eme eme ´el´ el´ement eme nt d’un d’ unee variabl vari ablee tabu ta bula laire ire nomm´ no mm´e T avec l’instruction T(i). Les Le s ´el´ el´ement em entss sont so nt indi in dic´ c´es es `a partir de 1. Effectuons, par exemple, une permutation circulaire vers la droite des ´el´ el´ ements ements du tableau t. DECLARE TYPE numberTab IS VARRAY ( 1 0 ) OF NUMBER; t numb number erTa Tab b; i number ; k number ; BEGIN t := numb number erTa Tab b(); t .EX .EXTEND( 1 0 ) ; FOR i IN 1 . . 1 0 LOOP t ( i ) := i ; END LOOP; k := t ( 1 0 ) ; FOR i i n REVERSE 2 . . 1 0 LOOP t ( i ) := t ( i − 1 ) ; END LOOP; t ( 1 ) := k ; FOR i IN 1 . . 1 0 LOOP DBMS OUTPUT. PUT LINE( t ( i ) ) ; END LOOP; END;
/
1.10 1.10.2 .2
Stru Struct ctur ures es
Un structure est un type regroupant plusieurs types. Une variable variable de type structur´e contient plusieurs variables, variables, ces variables s’appellent aussi des champs. Cr´ eatio eat ion n d’un d’u n type typ e struct str uctur´ ur´ e
On d´efinit efinit un type structur´ struct ur´e de la sorte : TYPE / ∗ nomType ∗ / I S RECO RECOR RD ( / ∗ l i s t e des cha champs mps ∗ / ); structu r´e construit constru it avec la syntaxe pr´ec´ ec´edente. edente. La liste suit la mˆeme eme syntaxe que la nomType est le nom du type structur´ liste des colonnes d’une table dans un CREATE CREATE TABLE. Par exemple, construisons le type point (dans IR2 ), TYPE p o i n t IS RECORD ( a b s c i s s e NUMBER, ordonnee NUMBER ); Notez bien que les types servant `a d´efinir efinir un type structur´ structu r´e peuvent ˆetre etre quelconques quelcon ques : variables scalaires, scalaires , tableaux, tableau x, structures, etc. D´ eclarati ecla ration on d’une d’un e variable variabl e de type structur´ stru ctur´ e
eer des variables variables de type point, la r` egle egle est toujours la point est maintenant un type, il devient donc possible de cr´eer mˆeme eme pour po ur d´eclarer ecla rer des variables variab les en PL/SQL, par exemple
34
p point ; permet perme t de d´eclarer eclarer une variable p de type point. Utilisation Utilisat ion d’une variable de type structur´ e
Pour Pou r acc´eder ed er `a un champ d’une d’ une variable variab le de type structur´ struct ur´e, e, en lecture ou en ´ecriture, ecriture , on utilise utili se la notation notati on point´ p oint´ee ee : app el´e c de la variable variab le structu str uctur´ r´e appel´ app el´ee ee v. Par exemple, v.c est le champ appel´ DECLARE TYPE p o i n t IS RECORD ( a b s c i s s e NUMBER, ordonnee NUMBER ); p point ; BEGIN p . a b s c i s s e := 1 ; p . o r do do n ne ne e : = 3 ; DBMS OUTPUT. PUT LINE( LINE( ’ p . ab s c i s s e = ’ | | p . a b s c i s s e | | ’ a n d p . o r do d o n ne n e e = ’ | | p . ordonnee ) ; END;
/ Le script s cript ci-dessous ci-dess ous cr´ c r´ ee ee le type point, puis p uis cr´ee ee une variable variab le t de type point, et enfin affecte aux champs abscisse et ordonnee du point p les valeurs 1 et 3.
35
1.11 1.11
Util Utilis isat atio ion n du PL/S PL/SQL QL
Ce cours est une introduction aux interactions possibles entre la base de donn´ ees ees et les scripts PL/SQL.
1.11 1.11.1 .1
Affec Affecta tati tion on
On place dans une variable le r´esultat esultat d’une requˆete ete en utilisant utilis ant le mot-cl´e INTO. Les instructions champ p 1, SELECT cham FROM . . .
. . . , cham champ p n INTO v 1 , . . . , v n
affecte aux variables v 1, ..., v n les valeurs retourn´ees ees par la requˆete. ete. Par exemple DECLARE num NUMBER; nom VARCHAR2(3 0) := ’ Poup´ Poup´ ee e e Ba Batm tman an ’ ; BEGIN SELECT numprod INTO num FROM PRODUIT nomprod = nom nom ; WHERE nomprod
DBMS OUTPUT. PUT LIN LINE( E( ’ L ’ ’ a r t i c l e ’ | | nom | | ’ a pour num´ num´ero e ro ’ | | num); END;
/ Prˆ etez etez attention au fait que la requˆ requˆete ete doit retourner retourner une et une une seule ligne, sinon, sinon, une erreur erreur se produit `a l’ex´ l’ ex´ecut ec ution ion..
1.11.2 1.11.2
Tables ables et struc structur tures es
Si vous ne tenez pas `a vous prendre la tˆ ete ete pour choisir choisir le type de chaque chaque variabl variable, e, demandezdemandez-vous vous ce que vous vous allez mettre mettre dedans ! Si vous tenez tenez `a y mettre une valeur qui se trouve dans une colonne d’une table, il est possible de vous r´ef´ ef´erer erer directement directem ent au type de cette colonne avec le type nomTable.nomColonne%type. Par exemple, DECLARE num num PRODUIT. numprod nump rod%ty %ty p e ; nom nom PR PRODUIT. nomprod%typ nomprod%typ e := ’ Poup´ee e e Batman Batman ’ ; BEGIN SELECT numprod INTO num FROM PRODUIT nomprod = nom nom ; WHERE nomprod
DBMS OUTPUT. PUT LIN LINE( E( ’ L ’ ’ a r t i c l e ’ | | nom | | ’ a pour num´ num´ero e ro ’ | | num); END;
/ Pour aller plus loin, il est mˆ eme eme possible de d´ eclarer eclarer une structure pour repr´ esenter esenter une ligne d’une table, le type porte alors le nom suivant : nomTable%rowtype. DECLARE nom nom PR PRODUIT. nomprod%typ nomprod%typ e := ’ Poup´ee e e Batman Batman ’ ; l i g n e PRODUIT%ro wt yp e ; BEGIN SELECT ∗ INTO l i g n e FROM PRODUIT WHERE nomprod nomprod = nom nom ;
DBMS OUTPUT. PUT LIN LINE( E( ’ L ’ ’ a r t i c l e ’ | | l i gn e . nomp nompro rod d | | ’ a pour num´ num´ ero e ro ’ | | li gn e . nump numpro rod d ); END;
/
36
1.11.3 1.11.3
Transac ransactio tions ns
Un des m´ecanismes ecanisme s les plus puissants des SGBD r´ecents ecents r´eside eside dans le syst`eme eme des transactions. transac tions. Une transaction transac tion est un ensemble d’op´ d ’op´erations eration s “atomiques”, “atom iques”, c’est-`a-dire a-dire indivisible. indivis ible. Nous consid´ererons ererons qu’un ensemble d’op´erations eration s est e st indivisible indivi sible si une ex´ecution ecution partielle partiel le de ces instructions instru ctions poserait posera it des probl`emes emes d’int´egrit´ egrit´e dans la base de donn´ees. ees. Par exemple, dans le cas d’une base de donn´ees ees de gestion de comptes en banque, un virement d’un compte `a un autre se fait en deux temps : cr´ editer editer un compte compte d’une somme s, et d´ebiter ebiter un autre de la mˆeme eme somme s. Si une erreur survient pendant p endant la deuxi` eme eme op´ eration, eration, et que la transaction est interrompue, le virement est incomplet et le patron va vous assassiner. Il convient convient donc de disposer d’un m´ ecanisme ecanisme permettant de se prot´ eger eger de ce genre de d´ esagr´ esagr´ ement. ement. Plutˆot o t que se casser la tˆete ete `a tester les erreurs `a chaque ´etape etap e et `a balancer des instructions p ermettant de “revenir en arri` ere”, ere”, nous allons utiliser les instructions COMMIT et ROLLBACK. Voici le squelette d’un exemple : / ∗ i n s t r u c t i o n s ∗ / IF / ∗ e r r e u r ∗ / THEN ROLLBACK; ELSE COMMIT; END;
Le ROLLBACK annule toutes les modifications faites depuis le d´ ebut ebut de la transaction (donc depuis le pr´ec´ ec´ edent edent enregist re d´ efinitivement efiniti vement dans la base de donn´ees. ees. COMMIT), COMMIT les enregistre La variable d’environnement AUTOCOMMIT, qui peut ˆetre etre positionn´ posit ionn´ee ee a` ON ou a` OFF permet d’activer la gestion des transactions. Si elle est positionn´ee ee `a ON, chaque instruction a des r´ epercussions epercussions imm´ ediates ediates dans la base, sinon, les modifications modifications ne sont sont effective effectivess qu’une qu’une fois qu’un COMMIT a ´et´e ex´ecut´e.
37
1.12 1.12
Exce Except ptio ions ns
Le m´ecanisme ecan isme des exceptions est impl´ imp l´ement´ ement´e dans d ans la plupart plup art des langages lang ages r´ecent, ecent , nota n otament ment orient´ orie nt´es es objet ob jet.. Cett C ettee fa¸con con de programmer programm er a quelques avantages avantages imm´ediats ediats : – obliger les programmeurs e en vous suppliant programmeurs ` a traiter les erreurs : combien de fois votre prof de C a hurl´ de v´erifier erifier les valeurs retourn´ees ees par un malloc, ou un fopen ? La plupart des compilateurs des langages `a (notamm ent java) ne compilent compile nt que si pour p our chaque erreur potentiell p otentielle, e, vous avez pr´epar´ epar´e un bloc de exceptions (notamment code (´ eventuellement eventuellement vide...) pour la traiter. Le but est de vous assurer que vous n’avez pas oubli´ e d’erreur. – Rattraper les erreurs en cours d’ex´ programm ez un syst`eme eme de s´ecurit´ ecurit´e de centrale ecution ecution : Si vous programmez nucl´ eaire eaire ou un pilote automatique pour l’aviation civile, une erreur de m´ emoire emoire qui vous afficherait l’´ecran ecran bleu de windows, windows, ou le message “Envoy “Envoyer er le rapport rapport d’erreur d’erreur ?”, ou plus simplement simplement le fameux fameux “Segment “Segmentation ation fault” produirait un effet des plus mauvais. mauvais. Certaines erreurs d’´execution execution sont rattrapables, autrement dit, il est possible possi ble de r´ esoudre esoudre le probl`eme eme sans interrompre interrompr e le l e programme. programm e. Ecrire e le traite traitemen mentt des erreur erreurss a ` part : Pour – Ecrir Pou r des raiso ra isons ns fiabi fia bilit lit´´e, e, de lisib li sibil ilit´ it´e, e, il a ´et´ et´e consi con sid´ d´er´ er´e que m´ elanger elanger le code “normal” et le traitement t raitement des erreurs ´etait etait un style de programmation perfectible... Dans les langages `a exception, exce ption, les erreurs e rreurs sont trait´ tr ait´ees ees `a part.
1.12.1 1.12.1
Rattra Rattraper per une except exception ion
Je vous ai menti dans le premier cours, un bloc en PL/SQL a la forme suivante : DECLARE / ∗ d e c l a r a t i o n s ∗ / BEGIN / ∗ i n s t r u c t i o n s ∗ / EXCEPTION
/ ∗ t r a i t em e m e n t d es e s e r r e ur u r s ∗ / END;
Une exception est une “erreur type”, elle porte un nom, au mˆ eme eme titre qu’une qu’une variable ariable a une identificateur identificateur,, par exemple GLUBARF. Lorsque dans les instructions, l’erreur GLUBARF se produit, le code du BEGIN s’interrompt et le code de la section EXCEPTION est lanc´e. e. On dit aussi que quand une exception est lev´ ee (raised) (on dit aussi jet´ ee (thrown)), on la rattrape (catch) dans le bloc EXCEPTION. La section EXCEPTION a la forme suivante : EXCEPTION WHEN E1 THEN
/ ∗ t r a i t e m e n t ∗ / WHEN E2 THEN
/ ∗ t r a i t e m e n t ∗ / WHEN E3 THEN
/ ∗ t r a i t e m e n t ∗ / WHEN OTHERS THEN / ∗ t r a i t e m e n t ∗ / END;
On ´enum` enum`ere ere les erreurs les plus pertinentes en utilisant leur nom et en consacrant `a chacune d’elle un traitement particulier particulier pour rattraper rattraper (ou propager) propager) l’erreur. l’erreur. Quand un bloc est trait´ trait´e, e, les WHEN suivants sui vants ne sont pas ´evalu´ evalu´es. es. l’except ion par d´efaut, efaut, OTHERS est es t touj to ujou ours rs v´erifi´ eri fi´e, e, sauf sa uf si un cas pr´ec´ ec´edent ede nt a ´et´ et´e v´erifi´ eri fi´e. e. Dans Dan s l’exe l’ exempl mplee OTHERS est l’exception suivant : DECLARE / ∗ d e c l a r a t i o n s ∗ / BEGIN / ∗ i n s t r u c t i o n s ∗ / COMMIT; EXCEPTION WHEN GLUBARF THEN ROLLBACK;
DBMS OUTPUT. PUT PUT LIN LINE( E( ’GL ’GLUBARF e x c e p t i o n r a i s e d ! ’ ) ; WHEN OTHERS THEN
DBMS OUTPUT . PUT LINE ( ’S ’ SQLCO LCODE = ’ | | SQLC SQLCOD ODE E) ; DBM DBMS OUTPU UTPUT T . PUT LINE ( ’SQL ’SQLERRM = ’ | | SQLE SQLERR RRM M) ; END;
38
Les deux variables globales SQLCODE et SQLERRM contiennent respectivement le code d’erreur Oracle et un message d’erreur correspondant `a la derni` derni` ere ere exception exception lev´ lev´ee. ee. Chaque Chaque exception exception a donc, en plus d’un nom, un code et un message.
1.12.2 1.1 2.2
Excepti Exce ptions ons pr´ ed´ ed´ efinies efini es
Bon nombre d’exceptions d’except ions sont pr´ed´ ed´efinies efinies par Oracle, par exemple – NO DATA FOUND est lev´ ee ee quand la requˆ ete ete d’une instruction de la forme SELECT SELECT ... INTO ... ne retourne aucune ligne – TOO MANY ROWS est lev´ee ee quand q uand la requˆete ete d’une instruction instruc tion de la forme SELECT SELECT ... INTO INTO ... retourne plusieurs lignes – DUP VAL ON INDEX est lev´ee ee si s i une u ne insertio i nsertion n (ou ( ou une u ne modifi m odification) cation) est refus´ee ee `a cause d’une contrainte d’unicit´ d’unici t´e. e. On peut enrichir notre exemple de la sorte : DECLARE num NUMBER; nom VARCHAR2(3 0) := ’ Poup´ Poup´ ee e e Ba Batm tman an ’ ; BEGIN SELECT numprod INTO num FROM PRODUIT nomprod = nom nom ; WHERE nomprod
DBMS OUTPUT. PUT LIN LINE( E( ’ L ’ ’ a r t i c l e ’ | | nom | | ’ a pour num´ num´ero e ro ’ | | num); EXCEPTION WHEN NO DATA DATA FOUN FOUND D THEN
DBMS OUTPUT.PUT T.PUT LINE( ’Aucun ’Aucun a r t i c l e ne por te l e nom ’ | | nom); TOO MA MANY NYRO ROWS WS THEN WHEN TOO DBMS OUTPUT.PU T.PUT LINE( ’ Pl us ie ur s a r t i c l e s por ten t le nom ’ | | nom); WHEN OTHERS THEN DBMS OUTPUT. PUT LINE( LINE( ’ I l y a un gr os pro bl`eme e me . . . ’ ) ; END;
/ eve eve une exception exceptio n si la requˆete ete renvoie un nombre de lignes diff´erent erent de 1. SELECT SELECT numprod numprod INTO num... l`
1.12 1.12.3 .3
Codes Codes d’er d’erre reur ur
Je vous encore menti, certaines exceptions n’ont pas de nom. Elle ont seulement un code d’erreur, il est conseill´ e de se reporter `a la documentation pour les obtenir. On les traite de la fa¸con con suivante EXCEPTION WHEN OTHERS THEN
I F SQLC SQLCOD ODE E = CODE CODE11 THEN / ∗ t r a i t e m e n t ∗ / ELSI EL SIF F SQLC SQLCOD ODE E = CODE CODE22 THEN / ∗ t r a i t e m e n t ∗ / ELSE
DBMS OUTPUT. PUT LINE( LINE( ’ J ’ ’ v o i s pas c ’ ’ que ca p e ut ut e t r e . . . ’ ) ; END;
C’est souvent le cas lors de violation de contraintes.
1.12.4
D´ eclarer eclarer et lancer lancer ses propres exceptions exceptions
Exception Exception est un type, on d´ eclare eclare donc les exceptions exceptions dans une section section DECLARE. DECLARE. Une exception exception se lance avec l’instruction RAISE. Par exemple, DECLARE GLUBARF EXCEPTION;
39
BEGIN RAISE RAIS E GL GLUB UBAR ARF F; EXCEPTION WHEN GLUBARF THEN
DBMS OUTPUT. PUT LINE( LINE( ’ g l u b a r f r a i s e d . ’ ) ; END;
/
40
1.13 1.13
Sous Sous-p -pro rogr gram amme mess
1.13.1 1.13. 1
Proc´ edures edures
Syntaxe
On d´efinit efini t une proc´ pro c´edure edur e de d e la sorte sort e CREATE OR REPLACE PROCED PROCEDURE URE / ∗ nom ∗ / ( / ∗ p a r a m e t r e s ∗ / / )) I S
/ ∗ d e cl c l a ra r a t io i o n d e s v a r i ab a b l e s l o c a l e s ∗ / BEGIN / ∗ i n s t r u c t i o n s ∗ / END;
les param` etres etres sont une simple liste de couples nom type type. Par exemple, la procedure suivante affiche un compte `a rebours. PROCEDURE co mp te AR eb ou rs ( n NUMBER) I S CREATE OR REPLACE PR BEGIN IF n >= 0 THEN DBMS OUTPUT. PUT LINE ( n ) ; compteARebours(n − 1 ) ; END IF ; END; Invocation
En PL/SQL, une proc´edure edure s’invoque tout simplement avec son nom. Mais sous SQL+, on doit utiliser le mot-cl´ e CALL. Par exemple, on invoque le compte `a rebours sous SQL+ avec la commande CALL compteARebours(20) compteARebours(20). Passage de param` etres etre s
Oracle permet perme t le passage de param`etres etres par r´ef´ ef´erence. erence. Il existe trois types de passage de param`etres etres : – IN : passage par valeur – OUT : aucune valeur pass´ ee, ee, sert de valeur valeur de retour – IN OUT pa ssage age de param pa ram``etre et re par r´ef´ ef´erence ere nce OUT : pass Par d´efaut, efaut, le passage de param`etre etre se fait de type IN. REPLA LAC CE PR PROCEDURE i n c r ( v a l IN OUT NUMBER) I S CREATE OR REP BEGIN v al a l : = v al al + 1 ; END;
1.13.2 1.13.2
Fonctio onctions ns
Syntaxe
On cr´ ee ee une nouvelle fonction de la fa¸con con suivante : CREATE OR REPLACE REPLACE FUNCTION FUNCTION / ∗ nom ∗ / ( / ∗ p a r a m e t r e s ∗ / / )) RETU RETURN RN / ∗ t y p e
∗ / I S / ∗ d e cl c l a ra r a t io i o n d e s v a r i ab a b l e s l o c a l e s ∗ / BEGIN / ∗ i n s t r u c t i o n s ∗ / END;
L’instruction RETURN sert `a retourner une valeur. Par exemple, CREATE OR REPLACE FUN FUNCTION ION mo du le ( a NUMBER, b NUMBER) RETU RETURN RN NUMBER I S
BEGIN IF a < b THEN RETU RETURN RN a ; ELSE
RETURN mo modu du le ( a − b , b ) ; 41
END IF ; END; Invocation
Tout comme les proc´edures, edures, l’invocation l’invocati on des d es fonctions fo nctions ne pose p ose aucun a ucun probl`eme eme en e n PL/SQL, par contre, sous SQL+, c’est quelque peu particulier. On passe par une pseudo-table nomm´ ee ee DUAL de la fa¸con con suivante : od ul ul e ( 2 1 , 1 2 ) FROM DUAL; SELECT m od Passage de param` etres etre s
Les param`etres etres sont toujours toujou rs pass´es es avec le type IN.
42
1.14 1.14
Curs Curse eurs urs
1.14.1 1.14.1
Introd Introduct uction ion
Les instructions de type SELECT f ontionnentt que sur des requˆetes etes SELECT ... INTO INTO ... manquent de souplesse, elles ne fontionnen retourant une et une seule valeur. Ne serait-il pas int´ eressant eressant de pouvoir placer dans des variables variables le r´ esultat esultat d’une requˆete ete retournant retourn ant plusieurs plusieu rs lignes ? A m´editer... editer.. .
1.14 1.14.2 .2
Les Les cu curs rseu eurs rs
Un curseur est un objet contenant contenant le r´ esultat esultat d’une requˆ ete ete (0, 1 ou plusieurs lignes). d´ ecla ec lara rati tion on
Un curseur cu rseur se d´eclare eclare dans une section DECLARE : CURSOR / ∗ nomcurseur ∗ / I S / ∗ r e q uˆe t e ∗ / / ;; Par exemple, si on tient `a r´ecup´ ecup´erer erer tous tou s les employ´ empl oy´es es de la table tab le EMP, on d´eclare eclare le curseur suivant. CURSOR emp cur IS SELECT ∗ FROM EMP; Ouverture
Lors de l’ouverture d’un curseur, la requˆ ete ete du curseur est ´evalu´ evalu´ee, ee, et le curseur contient contient toutes les donn´ ees ees retourn´ees ees par la requˆete. ete. On ouvre o uvre un curseur dans une section BEGIN : OPEN / ∗ nomcurseur ∗ / / ;; Par exemmple, DECLARE CURSOR emp cur IS SELECT ∗ FROM EMP; BEGIN OPEN emp cur ; / ∗ U t i l i s a t i o n d u c ur u r se s e ur u r ∗ / END; Lecture d’une ligne
Une fois ouvert, le curseur contient toutes les lignes du r´ esultat esultat de la requˆ ete ete On les r´ ecup` ecup` ere ere une par une en utilis uti lisant ant le mot-cl´ mot- cl´e FETCH : FETCH / ∗ nom curseur
∗ / INTO / ∗ l i s t e v a r i a b l e s ∗ / / ;;
La liste de variables peut ˆetre etre remplac´ee ee par pa r une un e structure st ructure de type typ e nom curseur%ROWTYPE. Si la lecture de la ligne ´echoue, echoue, parce qu’il n’y a plus de ligne `a lire, l’attribut l’attribut %NOTFOUND prend la valeur vrai. DECLARE CURSOR emp cur IS SELECT ∗ FROM EMP; li gn e emp cur% cur%rowtype rowtype BEGIN OPEN emp cur ; LOOP FETCH em p cu r INTO l i g n e ; EXIT WHEN e m p c u r%NOTFOUND ; DBMS OUTPUT. PUT PUT LINE( LINE( l i g n e . ename ) ; END LOOP; / ∗ . . . ∗ / END;
43
Fermeture
Apr` es es utilisation, il convient convient de fermer le curseur. CLOSE / ∗ nomcurseur ∗ / / ;; Compl´etons etons notre exemple, DECLARE CURSOR emp cur IS SELECT ∗ FROM EMP; li gn e emp cur% cur%rowtype rowtype ; BEGIN OPEN emp cur ; LOOP FETCH em p cu r INTO l i g n e ; EXIT WHEN e m p c u r%NOTFOUND ; DBMS OUTPUT. PUT PUT LINE( LINE( l i g n e . ename ) ; END LOOP; CLOSE emp cur ; END;
/ Le programme pr ogramme ci-dessus ci-dessu s peut p eut aussi au ssi s’´ s ’´ ecrire ecrire DECLARE CURSOR emp cur IS SELECT ∗ FROM EMP; li gn e emp cur% cur%rowtype rowtype ; BEGIN OPEN emp cur ; FETCH em p cu r INTO l i g n e ; WHIL WH ILE E e m p c u r%FOUND LO LOOP OP DBMS OUTPUT. PUT PUT LINE( LINE( l i g n e . ename ) ; FETCH em p cu r INTO l i g n e ; END LOOP; CLOSE emp cur ; END; Boucle FOR
Il existe une boucle FOR se chargeant de l’ouverture, de la lecture des lignes du curseur et de sa fermeture, FOR li gn e IN emp cur LOOP / ∗ Traitement ∗ / END LOOP; Par exemple, DECLARE CURSOR emp cur IS SELECT ∗ FROM EMP; li gn e emp cur% cur%rowtype rowtype ; BEGIN FOR li gn e IN emp cur LOOP DBMS OUTPUT. PUT PUT LINE( LINE( l i g n e . ename ) ; LOOP; END END;
/
44
1.15
Curseurs parametr´ es es
1.15.1 1.15.1
Introd Introduct uction ion
A votre avis, le code suivant suivant est-il valide valide ? DECLARE NUMBER n : = 1 4 ;
BEGIN DECLARE CURSOR C I S SELECT ∗ FROM PERSONNE WHERE numpers >= n ;
ROW C%rowType ; BEGIN FOR ROW IN C LO LOOP OP DBMS OUTPUT . PUT LINE (ROW. nump nu mp er s ) ; END LOOP; END; END;
/ R´ eponse eponse : non. La requˆ ete ete d’un curseur ne peut pas contenir de variables variables dont les valeurs valeurs ne sont pas fix´ees. ees. Pourquoi ? Parce que les valeurs des ces sont susceptibles de changer entre la d´eclaration eclaration du curseur et son ouverture. Le rem` rem `ede ede est un curseu cur seurr param pa ram´´etr´ et r´e. e.
1.15.2 1.15. 2
D´ efinition efinitio n
Un curseur param´etr´ etr´e est un curseur dont la requˆete ete contient des variables dont les valeurs ne seront fix´ees ees qu’`a l’ouverture.
1.15.3 1.15. 3
D´ eclaration eclarati on
On pr´ecise ecise la liste des noms et des type des param`etres etres entre parenth`eses eses apr`es es le nom du curseur : CURSOR / ∗ nom ∗ / ( / ∗ l i s t e de s par am`etr e tr es ∗ / ) I S / ∗ r e q uˆe t e ∗ / Par exemple, ex emple, cr´eeons eeons une requˆete ete qui, pour une personne perso nne donn´ee, ee, nous donne la liste des noms et pr´enoms enoms de ses enfants : CURSOR en fa nt s ( numparent NUMBER) I S SELECT ∗ FROM PERSONNE WHERE pere = numparent OR mere = numparent ;
1.15 1.15.4 .4
Ouv Ouvertu erture re
On ouvre un curseur param´etr´ etr´e en passant en param`etre etre les valeurs des variables : OPEN / ∗ nom ∗ / ( / ∗ l i s t e des par am`et e t res ∗ / ) Par exemple, OPEN e n f a n t s ( 1 ) ;
1.15.5 1.15.5
Lectur Lecture e d’une d’une ligne, ligne, ferme fermetur ture e
la lecture lect ure d’une d’un e ligne l igne suit les mˆemes emes r`egles egle s qu’avec q u’avec un curseur curs eur non param´ para m´etr´ etr´e. e.
45
1.15 1.15.6 .6
Bouc Boucle le pour pour
La boucle pour se charge de l’ouverture, il convient convient donc de placer les param` etre etre dans l’entˆ ete ete de la boucle, FOR / ∗ v a r i a b l e ∗ / IN / ∗ nom ∗ / ( / ∗ l i s t e pa ra m`et e t re s ∗ / / )) LO LOO OP / ∗ i n s t r u c t i o n s ∗ / LOOP; OP; END LO Par exemple, FOR e IN en fa nt s (1 ) LOOP DBMS OUTPUT. PUT LINE( e . n om pe rs | | END LO LOOP; OP;
1.15.7
’ ’ | | e . prenompers ) ;
Exemple r´ ecapitulatif ecapitulatif
DECLARE CURSOR pa re nt IS SELECT ∗ FROM PERSONNE PERSONNE;; p par ent%rowtype ent%rowtype ; CURSOR en fa nt s ( numparent NUMBER) I S SELECT ∗ FROM PERSONNE WHERE pere = numparent OR mere = numparent ; e enf ant s%rowtype rowtype ; BEGIN FOR p IN pa re nt LOOP DBMS OUTPUT. PUT LINE( LINE( ’ Les e n f an t s de ’ | | p . prenom prenom | | ’ ’ | | p.nom | | ’ s o n t : ’ ) ; FOR e IN en fa nt s (p . numpers) LOOP DBMS OUTPUT . PUT LINE( LINE ( ’ ∗ ’ | | e . prenom | | ’ ’ | | e . nom ); END LOOP; END LOOP; END;
/
46
1.16 1.16
Trigg rigger erss
1.16 1.16.1 .1
Prin Princi cipe pe
Un trigger tri gger est une proc´ pro c´edure edur e stock´ sto ck´ee ee qui se lance lanc e automat auto matiqu iquement ement lorsqu’u lors qu’un n ´ev´ ev´enement enem ent se produi pro duit. t. Par ´ev´ ev´enement, enem ent, on entend entend dans ce cours cours toute modification modification des donn´ees ees se trouvant trouvant dans les tables. On s’en sert pour contrˆ contrˆ oler oler ou appliquer des contraintes qu’il est impossible de formuler de fa¸con co n d´eclar ecl arat ative ive..
1.16.2 1.16.2
Classifi Classifica catio tion n
Typ Ty pe d’´ d’ ´ ev´ eneme ne ment nt
Lors Lor s de d e la l a cr´ c r´eation eati on d’un trigger tri gger,, il i l convie c onvient nt de d e pr´ p r´eciser ecis er quel est le type typ e d’´ d ’´ev´ ev´enement enem ent qui le d´eclenche. ecle nche. Nous r´ealisero eali serons ns dans ce cours des triggers pour les ´ev´ ev´enements enements suivants : – INSERT – DELETE – UPDATE Moment Mome nt de l’´ executi exe cution on
On pr´ecise ecis e aussi auss i si le trigger tri gger doit ˆetre etre ´execut´ exec ut´e avant (BEFORE) ou apr` ap r`es es (AFTER) l’´ l’ ´ev´ ev´enem en emen ent. t. Ev´ enements enem ents non atomiques atomi ques
Lors que l’on fait un DELETE ees. Le trigger doit-il DELETE ..., il y a une seule instruction, mais plusieurs lignes sont affect´ees. ˆetre et re ex´ecut ec ut´´e pour ou r chaqu cha quee lign li gnee aff affec ect´ t´ee ee (FOR EACH ROW), ou seulement une fois pour toute l’instruction ( STATEMENT) ? – un FOR EACH es t ex´ecut ec ut´´e `a chaque chaqu e fois foi s qu’une qu ’une ligne est affect´ee. ee. EACH ROW TRIGGE TRIGGER R est – un STATEMENT TRIGGER est es t ´exec ex ecut ut´´ee ee `a chaque fois qu’une instruction est lanc´ee. ee.
1.16.3 1.16. 3
Cr´ eation eation
Syntaxe
On d´ eclare eclare un trigger avec l’instruction suivante suivante : CREATE OR REPLACE TRIGGER n o m t r i g g e r [ BEFORE BEFORE | AFTER] [ INSERT | DELETE | UPDATE] ON nomtable
[ FOR EACH EACH ROW | ] DECLARE / ∗ d e c l a r a t i o n s ∗ / BEGIN / ∗ i n s t r u c t i o n s ∗ / END; Par exemple, SQL> 2 3 4 5 6
CREATE OR REPLACE TRIGGER p a s D e D e l e t e D a n s C l i e n t BEFORE DELETE ON CLIENT
BEGIN RAIS RA ISE E APPL APPLIC ICAT ATIO ION N ERRO ERROR( R( − 2 0 5555 5 , ’ Va Va t e f a i r e END; /
D´e c l e n c h e u r c r ´e ´e . SQL> SELE SELECT CT COUNT( ∗ ) 2 FROM CLIENT; CLIENT; COUNT( ∗ )
−−−−−−−−−− 21 SQL> DELETE FROM CLIENT; CLIENT;
47
. . . ’ );
DELETE FROM CLIENT
∗ ERRE ERREUR UR `a l a l ig ig n e 1 : ORA− 2 0055 5555 : Va Va t e f a i r e . . . ORA− 0 6 51 51 2 : `a ”SC ”SCOTT OTT . PASD PASDED EDEL ELET ETE EDANS DANSCL CLIE IEN NT” , l i g n e 2 ORA− 0408 8: e r r e u r l o r s d ex ´ec e c u ti on du d´ec e c le nc he ur ’SC ’SCOTT.PA T.PASDEDELETEDANSCLIENT ’
−−−−−−−−−− 21 L’instruction RAISE APPLICATION ERROR(code, eve eve une exception sans nom portant un code code et ERROR(code, message) l` un message d’erreur message. Vous remarquez remarque z que comme l’erreur a ´et´ et´e lev´ee ee avant la suppression, suppress ion, les donn´ees ees sont toujours toujou rs pr´esentes esentes dans la table CLIENT. Le trigger a contrˆol´ ol´e une un e r`egle, egl e, et com comme me elle el le n’´etait et ait pas respe res pect´ ct´ee, ee, il a lanc´ la nc´e une erreur. Combi Co mbina nais ison onss d’´ ev´ ev´ enem en ement entss
Il est possib po ssible, le, en s´eparant epar ant les types typ es d’´ev´ ev´enement enem ent par le mot-cl´ mot -cl´e OR, de d´efinir efini r un trigger tri gger d´eclench´ ecle nch´e par plusieur plus ieurss ´ev´ ev´enemen ene ments ts.. Les Le s variab vari ables les bool´ bo ol´eennes een nes INSERTING, UPDATING et DELETING permettent perme ttent d’identifier d’identifi er l’´ev´ ev´enement enement qui a d´ecle ec lench nch´´e le trig tr igge ger. r. CREATE OR REPLACE TRIGGER a f f i c h e E v e n e m e n t BEFORE INSER INSERT T OR UPDATE OR DELETE ON CLIENT
FOR EACH EACH ROW BEGIN IF INSER INSERTIN TING G THEN DBMS OUTPUT. PUT LIN LINE( E( ’ I n s e r t i o n dans CLIENT ’ ) ; ELSI EL SIF F UPDA UPDATI TING NG THEN DBMS OUTPUT. PUT LINE( LINE( ’ Mise a j ou r dan s CLIENT ’ ) ; ELSE
DBMS OUTPUT. PUT PUT LIN LINE( E( ’ S u p p re s s i on da ns CLIE LIENT ’ ) ; END IF ; END;
1.16.4
Acc` Acc` es aux lignes en cours de modification es modification
Dans les FOR EACH ROW triggers, il est possible avant la modification de chaque ligne, de lire l’ancienne ligne et la nouvelle ligne par l’interm´ediaire ediaire des deux variables structur´ structu r´ ees ees :old et :new. Par exemple le trigger suivant empˆeche eche de diminuer un salaire : CREATE OR REPLACE TRIGGER p a s D e B a i s s e D e S a l a i r e BEFORE UPDATE ON EMP
FOR EACH EACH ROW BEGIN I F ( : o l d . s a l > : new . sa l ) THEN RAISE APPLICATION ERROR( − 20567, ’ Pa P a s d e b a is i s s e de s a l a i r e ! ’ ) ; END IF ; END; Tables en mutation
Il est impossible, dans un trigger de type FOR EACH ROW de faire un SELECT sur la table en cours de modification. SQL> CREATE OR REPLACE TRIGGER b e f o r e S t a t e m e n t 2 BEFORE UPDATE ON CLIENT
48
3 4 5 6 7 8 9
DECLARE NB NUMBER; BEGIN SELECT COUNT( ∗ ) INTO NB FROM CLIENT; END;
/
D´e c l e n c h e u r c r ´e ´e . SQL> SQL> 2 3 4 5 6 7 8 9
CREATE OR REPLACE TRIGGER a f t e r S t a t e m e n t AFTER UPDATE ON CLIENT
DECLARE NB NUMBER; BEGIN SELECT COUNT( ∗ ) INTO NB FROM CLIENT; END;
/
D´e c l e n c h e u r c r ´e ´e . SQL> SQL> UPDATE CLIENT SET n o m c l i = n o m c l i ; 2 1 l i g n e ( s ) m i se se ( s ) a` j o u r . SQL> SQL> 2 3 4 5 6 7 8 9 10
CREATE OR REPLACE TRIGGER beforeForEachRow BEFORE UPDATE ON CLIENT
FOR EA EACH ROW DECLARE NB NUMBER; BEGIN SELECT COUNT( ∗ ) INTO NB FROM CLIENT; END;
/
D´e c l e n c h e u r c r ´e ´e . SQL> SQL> UPDATE CLIENT SET n o m c l i = n o m c l i ; UPDATE CLIENT SET n o m c l i = n o m c l i ∗ ERRE ERREUR UR `a l a l ig ig n e 1 : ORA− 0 40 40 91 9 1 : l a table SCOTT.CL T.CLIENT es t en mutation ; le d´ecl e cl enc heu r ou la f o n ct c t i o n n e p eu eu t l a v o i r ORA− 0 6 51 51 2 : `a ”SCOT ”SCOTT T .BEF .BEFOREFOREACHROW” , l i g n e 4 ORA− 040 88 : e r r e u r l o r s d e x´e c u t i o n du d´e c l e n c h e u r ’SC ’SCOTT.BE T.BEFOREFOREACHROW’
SQL> DROP TRIGGER beforeForEachRow ; D´ec e c le nc he ur su pp ri m´e . SQL> SQL>
49
SQL> 2 3 4 5 6 7 8 9 10
CREATE OR REPLACE TRIGGER afterForEachRow AFTER UPDATE ON CLIENT
FOR EA EACH ROW DECLARE NB NUMBER; BEGIN SELECT COUNT( ∗ ) INTO NB FROM CLIENT; END;
/
D´e c l e n c h e u r c r ´e ´e . SQL> SQL> UPDATE CLIENT SET n o m c l i = n o m c l i ; UPDATE CLIENT SET n o m c l i = n o m c l i ∗ ERRE ERREUR UR `a l a l ig ig n e 1 : ORA− 0 40 40 91 9 1 : l a table SCOTT.CL T.CLIENT es t en mutation ; le d´ecl e cl enc heu r ou la f o n ct c t i o n n e p eu eu t l a v o i r ORA− 0 6 51 51 2 : `a ”SCOT ”SCOTT T .AFTERFOREACHROW” , l i g n e 4 ORA− 040 88 : e r r e u r l o r s d e x´e c u t i o n du d´e c l e n c h e u r ’SC ’SCOTT.AF T.AFTERFOREACHROW’
1.16.5
Contourner Contourner le probl` eme des tables en mutation eme mutation
Il existe plusieurs fa¸cons cons de contourner c ontourner ce probl` p robl`eme eme : – Utiliser un STATEMENT trigger. Comme on ne sait pas quelles lignes ont ´et´ et´e modifi´ modi fi´ees, ees, on est oblig´e de toutes les traiter. Cette approche pr´ esente esente donc un inconv´ enient enient majeur : elle nous am` ene ene `a effectuer de nombreux traitements inutiles. – En ayant des d es donn´ do nn´ees ees redondantes. re dondantes. Il suffit que les donn´ d onn´ees ees servant s ervant `a la v´ erification erification se trouvent dans une autre table tab le que q ue celle c elle en mutat mu tation ion.. Cette Ce tte m´ethode eth ode a pour p our inconv´ inco nv´enient eni ent la l a m´emoire emoi re occup´ o ccup´ee ee et e t la l a quanti q uantit´ t´e de code cod e `a ´ecri ec rire re pour maintenir la coh´ co h´erence erence des donn´ d onn´ees. ees. Dans la plupart pl upart des cas, ca s, cette c ette solution soluti on est es t malgr´ ma lgr´e tout to ut la l a meilleure. mei lleure. Colonnes Colo nnes suppl´ ementaire ementa iress
Par exemple, si l’on souhaite empˆecher echer un client d’avoir plus de 10 comptes en banque, une solution est de placer dans la table client une colonne contenant le nombre de comptes. ALTER TABLE CLIENT ADD nbComptes number ; UPDATE CLIENT SET nbComp nbComptes tes = 0;
Une fois cette table cr´ee, ee, il convient convient de s’assurer que les donn´ ees ees de la colonne nbComptes contient contient toujours les bonnes valeurs. On le fait avec plusieurs sous-programmes : CREATE OR REPLACE TRIGGER metAJourNbComptes AFTER INSERT OR UPDATE OR DELETE ON COMPTECLIENT
BEGIN UPDATE CLIENT SET nbComptes =
( SELECT COUNT( ∗ ) SELECT COMPTECLIENT NT CC FROM COMPTECLIE WHERE CC. numCli = numCli
); END;
/ CREATE OR REPLACE TRIGGER v e r i f i e N b C o m p t e s INSERT T ON COMPTECLIENT BEFORE INSER
FOR EACH EACH ROW DECLARE nbComptes NUMBER; 50
BEGIN SELECT nbComptes INTO nbComptes FROM CLIENT WHERE numC numCli li = : new . numcli ; IF ( nbCo nbCompt mptes es >= 1 0 ) THEN
RAISE APPLICATION ERROR( − 20556, ’ Ce Ce c l i e n t a d e ja j a t r op o p d e c om om pt pt es es ’ ) ; END IF ; END;
/ On peut affiner en rempla¸cant cant metAJourNbComptes par plusieurs sous-programmes : CREATE OR REPLACE TRIGGER i n i t i a l i s e N b C o m p t e s BEFORE INSER INSERT T ON CLIENT
FOR EACH EACH ROW BEGIN : new new . nbCo nbCompt mptes es := 0; END; / CREATE OR REPLACE TRIGGER metAJourNbComptes AFTER INSERT OR UPDATE OR DELETE ON COMPTECLIENT
FOR EACH EACH ROW BEGIN I F DELE DELETIN TING G OR UPDATING THEN nbComptes = nbComptes nbComptes − 1 UPDATE CLIENT SET nbComptes WHERE numcli = : old . numcli ; END IF ; IF INSER INSERTIN TING G OR UPDATING THEN UPDATE CLIENT SET nbComptes = nbComptes + 1 WHERE numcli = : new new . numcli ; END IF ; END; / Tables Table s suppl su ppl´ ´ ementai eme ntaires res
Si l’on souhaite par exemple empˆ echer echer les circuits dans la table t able PERSONNE, il est n´ ecessaire ecessaire de faire un parcours de graphe. Ce qui n´ ecessite ecessite des SELECT dans la table en cours de mutation. La seule solution est dans ce cas d’avoir une table miroir qui contient les colonnes cl´es es primaire p rimaire et ´etrang` etrang`eres eres de cette c ette table, et de s’en s ’en servir pour d´etecter etecter les circuits. CREATE TABLE MIRRORPERSONNE
( numpers NUMBER PRIMARY KEY, p e r e NUMBER, mere NUMBER ); Nous Nou s allo a llons ns ensuit ens uitee pro p roc´ c´eder eder de mˆeme, eme, en r´epercu ep ercutant tant chaque chaqu e op´eration erat ion de PERSONNE sur MIRRORPERSONNE. CREATE OR REPLACE TRIGGER miseAJourMirrorPersonne BEFORE UPDATE OR INSERT OR DELETE ON PERSONNE
FOR EACH EACH ROW BEGIN I F DELE DELETIN TING G OR UPDATING THEN DELETE FROM MIRRORPERSONNE WHERE numpers = : ol d . numpers ; END IF ; IF INSER INSERTIN TING G OR UPDATING THEN INSERT INSE RT INTO MIRRORPERSONNE VALUES 51
( : new . nump numper erss , : new new . pere , : new . me mere re ) ; END IF ; END;
/ Une fois cela fait, il suffit de rechercher re chercher si une personne person ne ins´ i ns´er´ er´ee ee est es t une u ne descendante d escendante d’elle mˆ eme eme dans MIRRORPERSONNE. Fi nd n d NUMBER) CREATE OR REPLACE FUNCTION t r o u v eC i r cu i t ( cu rr en t NUMBER, t o Fi RETU RETURN RN BOOLE BOOLEAN AN I S numPere NUMBER; numMere NUMBER; BEGIN I F ( c u r r e n t I S NULL) THEN RETURN FALSE ; END IF ; mere re INTO numPere , numMe numMere re SELECT pere , me FROM MIRRORPERSONNE WHERE numPers = current ; RETURN ( numPere = to Fi nd OR numM numMer eree = toFi nd OR tr ou ve Ci rc ui t (numPe (numPere re , toFind ) OR t r o u v e C i r c u i t ( nu numMere , t o F i n d ) ) ; END; / CREATE OR REPLACE TRIGGER v e r i f i e C i r c u i t AFTER UPDATE OR INSERT ON PERSONNE
FOR EACH EACH ROW BEGIN I F ( t r o u v e C i r c u i t ( : n ew . n u m mP Per s , : new . n um um Pe Pe rs rs ) ) THEN RAISE APPLICATION ERROR( − 20557, ’ Ci rc ui t dans l ’ ’ arbr e g´en´ e n´eal e al ogi que . ’ ) ; END IF ; END; /
52
1.17 1.17
Pack ackages ages
1.17 1.17.1 .1
Prin Princi cipe pe
Un package package est un ensemble de sous-programmes et de variables form´e par – Une sp´ s p´ ecification ecificat ion : d´eclaration eclarati on de variables et de d e sous-program sous -programmes mes – Un corps : impl´ ementation ementation des sous-programmes Tout ce qui se trouve dans la sp´ecification ecification doit se trouver dans le corps, mais la r´eciproque eciproque est fausse. Un package package satisfait les points suivants : – encapsulation : certains traitements t raitements sont masqu´ es, es, seule la sp´ ecification ecification du package package est visible. Cela a pour avantage de simplifier la tˆache ache de celui qui va utiliser le package. – modu poss ible de d´evelopper eveloppe r s´epar´ epar´ement ement les diverses parties de l’application l’appli cation.. le d´eveloppement eveloppem ent mo dula lari rit´ t´ e : il est possible devient ainsi un assemblage de package. Ces deux aspects fournissen fournissentt une souplesse certaine certaine au niveau niveau du d´ eveloppeme eveloppement nt : il est possible possible de modifier le corps d’un package package sans changer sa sp´ ecification, ecification, donc sans modifier le fonctionnement de l’application.
1.17.2 1.17. 2
Sp´ ecification ecificatio n
La syntaxe permettant perme ttant de cr´eer eer l’entˆete ete est la suivante : REPLA LAC CE PA PACKAGE no mp ac ka ge I S CREATE OR REP / ∗ declarations ∗ / END nomPackage ;
/ Par exemple, PACKAGE c om pt e ur I S CREATE OR REPLACE PAC p r oc o c e du du r e r e s e t ; f u n c t i o n n ex e x t Va Va lu l u e r e t u r n number ; END compteur ; /
1.17 1.17.3 .3
Corp Corpss
La syntaxe permettant de cr´ eer eer le corps est la suivante suivante : CREATE OR REP REPLA LAC CE PACKAGE BO BODY no m pa ck ag e I S
/ ∗ implementation ∗ / END nomPackage ;
/ Par exemple, CREATE OR REP REPLA LAC CE PACKAGE BO BODY c o m p t e u r I S c p t NUMBER : = 0 ;
PROCEDURE r e s e t I S BEGIN c pt pt := 0 ; END; FUNCTION n e x t V a l u e RETURN NUMBER I S BEGIN cpt := cpt + 1; RETURN c p t − 1 ; END; END compteur ; / 53
On peut utiliser un package depuis n’importe quel script PL/SQL : DECLARE nb NUMBER; BEGIN FOR nb IN 4 . . 20 LOOP DBMS OUTPUT. PUT LINE(CO LINE(COMPTEUR. n e x t V a l u e ( ) ) ; END LOOP; COMPTEUR. RESET RESET(( ) ; FOR nb IN REVERSE 0 . . 1 0 LOOP DBMS OUTPUT. PUT LINE(CO LINE(COMPTEUR. n e x t V a l u e ( ) ) ; END LOOP; END;
/
54
Chapitre 2
Exercices 2.1
Contraintes d´ eclaratives eclaratives
Nous nous proposons de modifier le script de cr´ eation eation de table de l’annexe A.1.
Exercice 1 Modifiez le script de fa¸con con `a ce que les saisies des valeurs suivantes soit obligatoire : – Le prix des articles propos´ prop os´ es es – La quantit´ quant it´e des d es pro p roduit duitss livr´ l ivr´es es
Exercice 2 Rep´ erez erez les colonnes, couples de colonnes, voire triplets de colonnes, `a choisir comme cl´es es primaires. Modifiez le script de fa¸con con a` ce que cela se fasse.
Exercice 3 Faites de mˆ eme eme pour les cl´es es ´etrang` etrang` eres, eres, sans oublier qu’il ne peut figurer dans une livraison que des produits propos´es es par le fournisseur qui effectue cette livraison.
Exercice 4 Ins´erez erez quelques qu elques lignes dans chaque chaq ue table. tab le.
Exercice 5 Rep´erez erez toutes tou tes les contraint cont raintes es des questio ques tions ns pr´ec´ ec´edentes edent es dans dan s user constraints, supprimez-les.
Exercice 6 Red´efinissez efinisse z toutes tou tes ces contraintes co ntraintes avec la syntaxe ALTER ALTER TABLE
55
2.2
Introduction aux requˆ requˆ etes etes
Nous souhaitons souhait ons g´erer erer un secr´etatiat etatia t p´edagogique edagogiq ue avec la base de A.2. Les Le s sorti sor ties es g´en´ en´er´ er´ees ees par les deux deu x premi` pre mi`eres ere s quest qu estion ionss sont son t donn´ do nn´ees. ees . Apr` Apr `es, es, ¸ca ca sera `a vous de v´erifier erifi er si les r´esulta esu ltats ts de vos requˆetes etes est coh´erent erent ou non. non .
Exercice 1 Afficher la liste des noms des modules. Oracle C++ C Algo Merise PL/SQL PL/SQL Oracle Oracle mySQL Algo avanc´ avance ´ 8 ligne( ligne(s) s) s´ electionn´ electionn´ ee(s). ee(s).
Exercice 2 Afficher la liste des num´ eros eros des modules prerequis pour d’autres modules. 1 3 5 3 ligne( ligne(s) s) s´ electionn´ electionn´ ee(s). ee(s).
Exercice 3 En util ut ilis isant ant le r´esult esu ltat at de la requˆ req uˆete et e pr´ec´ ec´edente ede nte,, et l’op´ l’ op´erate era teur ur IN, affichez les noms de ces trois modules.
Exercice 4 Augmentez les notesMin n´ecessaires ecessaire s pour p our s’inscrire s’inscr ire en ’Algo avanc´ e’ e’ de deux points. Celles n´ecessaires ecessaire s pour p our aller en ’PL/SQL Oracle’ d’un point.
Exercice 5 Affichez, par ordre o rdre de d e noteMin not eMin croissantes, cr oissantes, les num´eros eros des d es modules mo dules n´ecessaires ecessaire s pour p our acc´ a cc´eder eder au module mo dule ’PL/SQL Oracle’.
Exercice 6 Affichez les num´eros eros des modules dans lequels je ne peux p eux pas m’inscrire avec 10 en merise.
Exercice 7 Affichez les noms de tous les modules dont le libell´e contient les mots ’Algo’ ou ’SQL’.
Exercice 8 On utilisera pour les questions suivantes les tables de A.3.
56
Exercice 9 La table RECTANGLE contient cont ient des rectang rect angles les sp´ecifi´ ecifi´es es par les coo coordon rdonn´ n´ees ees de deux sommets som mets diam´etraleme etra lement nt oppos´ opp os´es, es, leurs leu rs arˆetes ete s sont parall` para ll`eles eles aux axes. a xes. Certains Cert ains rectang rect angles les ont o nt des coo coordon rdonn´ n´ees ees erron e rronn´ n´ees, ees, c’est-` c’es t-`a dire que soit ils sont des segments, soit les coordonn´ ees ees de certains points ne sont pas dans le bon ordre. Supprimez, avec une seule instruction, tous les rectangles-segments.
Exercice 10 Affichez tous les intervalles contenant la valeur 10.
Exercice 11 Afficher tous les interv Afficher intervalles alles qui contienne contiennent nt [5, 7]. Puis Puis tous tous les inter interv valles alles conten contenus us dans dans [5, 35]. Puis tous les intervalles ayant une intersection non vide avec [15 , 20].
Exercice 12 Certains des rectangles sont pathologiques, dans le sens o`u les valeurs valeurs des coordonn´ees ees font que l’on n’a pas un point en haut `a gauche et un en bas `a droite. Afficher `a ces rectangles.
Exercice 13 Certains Certain s rectangles rectangl es mal d´efinis efinis peuvent ˆetre etre r´epar´ epar´es es si on permute les valeurs de xHautGauche et de xBasDroit et/ou celles de yHautGauche et de yBasDroit. Faites-le avec deux instructions UPDATE.
Exercice 14 Soit le point p oint de d e coordonn´ co ordonn´ees ees ( x, y ) = (2, 2), afficher les coordonn´ees ees des rectangles qui contiennent contiennent ce point. p oint.
Exercice 15 Afficher tous les rectangles ayant une intersection non vide avec le rectangle (4 , 9, 5, 10).
57
2.3 2.3
Join Jointu ture ress
Reprenons pour ce tp la base de don´ees ees de A.4.
Exercice 1 Afficher tous les noms des produits dont le num´ero ero a une occurence dans la table PROPOSER. NOMPROD -----------------------------Cotons Cotons tiges Poup´ ee ee Batman Batman Roue Roue de secour secours s
Exercice 2 Afficher tous les noms des fournisseurs dont le num´ ero ero a une occurence dans la table PROPOSER. NOMFOU -----------------------------f1 f2 f3
Exercice 3 Afficher les noms des fournisseurs avec pour chaque fournisseur la liste des produits propos´es. es. NOMFOU ---------------------------------------------------------f1 f1 f2 f3
NOMPROD ---------------------------------------------------------Roue de secours Poupee e ´e Batman Batman Poupee e ´e Batman Batman Cotons tiges
Exercice 4 Afficher les nom des fournisseurs proposant des ’Poup´ees ees Batman’ par ordre de prix croissant.
Exercice 5 Afficher les dates des livraisons effectu´ees ees par le fournisseur ’f1’ ;
Exercice 6 Afficher les noms de tous les produits d´ej` ej` a livr´ es es par le fournisseur ’f3’ ;
Exercice 7 Afficher toutes les lignes de la table LIVRAISON correspondant `a des livraisons dans lesquelles figure le produit ’Poup´ ’Po up´ee ee Bat B atman man’. ’.
Exercice 8 Pour les exercices suivants, nous travaillerons sur les donn´ees ees de A.5. Dans les questions o`u il vous est demand´e de de formuler formuler des requˆ requˆetes etes retournant retournant plusieurs plusieurs perso p ersonnes, nnes, il faut qu’il y ait une ligne par personne. personne. Affic Afficher her les noms et pr´enoms enom s des d es enfants enfa nts de Sofia Sofi a Koba K obalevs levska ka¨¨ıa. NOM ---------------------------------------------------------Leibniz Bach
PRENOM ---------------------------------------------------------Gottfried Wilhem Johann Sebastien
58
Exercice 9 Afficher les noms et pr´ enoms enoms des parents de Edvard Dijkstra. NOM ---------------------------------------------------------Jacqou Granger
Exercice 10 Afficher les noms et pr´ enoms enoms des enfants de jean-Sebastien Bach et Mireille Mathieu.
Exercice 11 Afficher les noms et pr´enoms enoms du fr`ere ere de d e Jacqouill J acqouillee la l a Fripouille. Fripouil le.
Exercice 12 Afficher les noms et pr´enoms enoms du cousin germain de Dijkstra Dijkstr a du d u cot´e de d e son p`ere. ere.
Exercice 13 Afficher les noms et prenoms du demi-fr`ere ere (du cot´e de sa m`ere) ere) du p`ere ere de Lara Fabian.
Exercice 14 Afficher les noms et pr´enoms enoms des p`eres eres des enfants de Kate Bush.
Exercice 15 Afficher les noms et pr´ enoms enoms du neveu de Jacqou le Croquant.
Exercice 16 Afficher les noms et pr´enoms enoms de la m`ere ere du fils du fils d’Andr´e Rieu.
Exercice 17 Afficher les noms et pr´ enoms enoms des parents et grand-parents de Sharon Stone. NOM ---------------------------------------------------------Bartoli Granger La Fripouille Leibniz Leroy Socrate
Nous utiliserons utilis erons les donn´ees ees de A.4. Il est demand´e dans da ns chaque exercice de formuler une requˆete. ete.
Exercice 1 Donner le nombre de fournisseurs.
Exercice 2 Donner le nombre no mbre de fournisseurs fournis seurs ayant d´ej` ej`a effectu´e une livraison. livraiso n.
Exercice 3 Quel est le prix du produit produ it propos´ prop os´e au prix le plus p lus ´elev´ elev´e par pa r ’f1’ ’f 1’ ?
Exercice 4 Combien de produits sont propos´es es pour chaque fournisseur proposant au moins un produit ?
Exercice 5 Afficher le nombre de produits qui ne sont propos´es es par aucun fournisseur.
Exercice 6 Afficher, pour chaque produit (dont on affichera le nom), le nombre de fournisseurs l’ayant l’ayant d´ej` ej`a livr li vr´´e. e.
Exercice 7 Donner pour chaque livraison le nom du fournisseur, le numero de livraison et le nombre de produits livr´es. es.
Exercice 8 Donner pour chaque livraison le nom du fournisseur, le numero de livraison, la date et le montant de la facture.
Exercice 9 Donner les noms des produits qui ne sont propos´es es que par un seul fournisseur.
Exercice 10 Donner les noms des fournisseurs qui ont livr´ e au moins une fois chaque produit qu’ils proposent.
60
2.5
Vues
Nous utiliserons utilis erons les donn´ees ees de A.4. N’h´esitez esitez pas, pour tester vos requˆ re quˆetes etes et `a ins´erer erer d’autr d’a utres es donn´ don n´ees ees dans dan s la base.
Exercice 1 Cr´eez eez une vue affichant pour chaque produit produ it ayant d´ej` ej`a ´et´ et´e livr´ li vr´e le num´ero ero du prod pr odui uitt et la somme so mme des quanti qua ntit´ t´es es livr´ees ees (toutes ( toutes livraisons livrais ons confondu c onfondues). es).
Exercice 2 Affichez Affiche z la quantit´ quant it´e totale tot ale livr´ liv r´ee ee du produit pro duit dont la quantit´ qua ntit´e totale tot ale livr´ liv r´ee ee est la plus plu s ´elev´ elev´ee. ee.
Exercice 3 Cr´ eez eez une vue affichant affichant pour chaque livraison, le montant de la facture.
Exercice 4 Cr´ eez eez une vue affichant p our chaque fournisseur, le total des factures sur toutes les livraisons.
Exercice 5 Affichez le total des factures du fournisseurs dont le total des factures est le moins ´elev´ elev´ e. e.
Exercice 6 Affichez le nombre de produits produ its distinct di stinctss livr´es es par le l e fournisseur fourn isseur ayant livr´ l ivr´e le plus pl us de produi p roduits ts distincts dis tincts.. Par nombre de produits pro duits distincts, on entend sans tenir compte de la quantit´e. e.
61
2.6 2.6
Requˆ Req uˆ etes ete s imbriqu´ imbr iqu´ees ees
Nous utiliserons utilise rons les donn´ d onn´ees ees de d e A.4. A.4 . Presque Pres que tous t ous les l es stratag` st ratag`emes emes sont autoris´ au toris´es, es, vous pouvez p ouvez utiliser ut iliser des fonction f onctionss d’agr´egation, egation , des vues, et des requˆetes etes imbriqu´ees. ees. Bon courage, l’aspirine l’aspiri ne n’est pas fournie.
Exercice 1 Donner, p our chaque fournisseur (afficher son nom), le nombre de produits propos´es, es, mˆ eme eme si ce fournisseur n’en propose aucun. Il est interdit d’utiliser OUTER OUTER JOIN !
Exercice 2 Afficher les noms des fournisseurs qui proposent le produit num´ero ero 2, il est interdit de faire des jointures !
Exercice 3 Afficher les noms des fournisseurs qui proposent des poup´ees ees Batman.
Exercice 4 Afficher les noms des fournisseurs qui ont d´ej` ej`a livr´ liv r´e des poup´ pou p´ees ees Batman. Batm an.
Exercice 5 Quels sont les noms des fournisseurs qui ont d´ej` ej` a livr´e tous leurs produits au moins une fois ?
Exercice 6 Donner, pour chaque fournisseur fournis seur (afficher son nom), le produit produ it propos´ propo s´e au prix le plus ´elev´ elev´e. e.
Exercice 7 Pour chaque produit p, quel sont les noms des fournisseurs fournisseurs qui, sur toutes ses livraisons, livraisons, ont livr´ e la plus grande quant qu antit´ it´e cumu c umul´ l´ee ee de prod pr odui uits ts p.
Exercice 8 ¡Afficher le nombre de produits propos´ prop os´ es es par les fournisseurs proposant le moins de produits. Normalement, un 0 devrait s’afficher... Pas un 1.
Exercice 9 Afficher le(s) nom(s) du(des) fournisseur(s) proposant le moins de produits.
Exercice 10 Afficher, pour chaque produit, produ it, le(s) nom(s) du(des) fournisseur(s) fourniss eur(s) qui l’a(ont) l ’a(ont) le plus pl us livr´ l ivr´e (en quantit´e cumul´ee). ee).
62
2.7
Compl´ ements ements sur les types
Vous modifierez mo difierez pour faire ces exercices le script de cr´ eation eation de tables de A.4.
Exercice 1 Rendez, `a l’aide de contraintes de type CHECK les saisies des champs qte, prix et dateli oligatoires.
Exercice 2 Empˆechez echez la saisie sai sie de prix pri x n´egatifs egat ifs ou nuls et de quantit´ qua ntit´es es n´egatives egat ives ou nulles. null es.
Exercice 3 On sait que la base a ´et´ et´e cr´ c r´e´ e´ee ee vers le moi moiss d’Octobr d’Oc tobree 2006 2006,, empˆechez echez l’ajou l’a joutt de livrais liv raisons ons ant´erieures erie ures `a ce mois.
Exercice 4 Impl´ementez ementez une contrainte d´eclarative eclarati ve empˆechant echant les livraisons livraiso ns les premiers mai de chaque ann´ee. ee.
Exercice 5 Impl´ementez ementez une contrainte d´eclarative eclarati ve obligeant obl igeant les noms des produits produ its `a commencer par une majuscule et `a ne comporter ensuite sur des minuscules. Si l’a jout d’une des contraintes est refus´ee, ee, demandez vous pourquoi et faites le n´ecessaire ecessaire (une commande UPDATE sera la bienvenue...) pour y rem´ re m´edier. edier.
63
2.8
R´ evisions evision s
Nous utiliserons utilis erons les donn´ d onn´ees ees de d e A.4. A.4 .
Exercice 1 Donner le nombre de fournisseurs fournis seurs ayant effectu´ effe ctu´e un nombre de livraisons livraiso ns sup´erieur erieur au ´egal egal `a deux.
Exercice 2 Quelles sont les ann´ees ees pendant penda nt lesquelles lesquel les le plus de livraisons livraiso ns ont ´et´ et´e effectu´ees ees ?
Exercice 3 Parmi Parmi les fournisseu fournisseurs rs qui ont livr´ e au moins une fois chaque produit qu’ils proposent, proposent, quels sont les derniers derniers `a avoir effectu´e une livraison. livraiso n.
64
2.9 2.9
Intr Introdu oduct ctio ion n au PL/S PL/SQL QL
Exercice 1 Ecrivez un programme affectant les valeurs 1 et 2 `a deux variables a et b, puis permutant les valeurs de ces deux variables.
Exercice 2 Ecrivez un programme pla¸cant cant la valeur 10 dans une variable a, puis affichant la factorielle de a.
Exercice 3 Ecrivez un programme pla¸cant cant les valeurs 48 et 84 dans deux variables a et b puis affichant le pgcd de a et b.
65
2.10 2.10
Tableau ableaux x et Struct Structure uress
Exercice 1 1. Cr´ eez eez un type tableau pouvan p ouvantt contenir jusqu’`a 50 entiers. 2. Cr´ eez une variable de ce type eez typ e , faites une allocation dynamique et dimensionnez ce tableau `a 20 emplacements. 3. Placez dans ce tableau la liste des 20 premiers carr´es es parfaits : 1 , 4, 9, 16, 25, . . . 4. Inversez l’ordre des ´el´ el´ements ements du tableau 5. Affic Affichez hez le tableau. tableau.
Exercice 2 Triez le tableau tab leau pr´ec´ ec´edent edent avec la m´ethode etho de du tri `a bulle.
Exercice 3 Recherchez, par dichotomie, dichotomi e, si l’´ l ’´el´ el´ement ement 225 se trouve t rouve dans d ans le tableau. t ableau.
Exercice 4 On impl´ imp l´emente ement e des d es listes list es chaˆın´ ın´ees ees avec des d es tableau tab leaux x de d e la l a sort s orte, e, SET SERVEROU SERVEROUTPUT TPUT ON DECLARE -- Maillo Maillon n d’une d’une liste liste cha^ chaın´ ı ^n´ ee ee TYPE TYPE CELL CELL IS RECORD RECORD ( -- Donn´ Donn´ ee ee de chaque chaque maillo maillon n data INTEGER, INTEGER, -- Indice Indice du maillo maillon n pr´ ec´ ec´ edent edent de la liste, liste, -- -1 s’il n’y en a pas previous INTEGER, -- Indice Indice du maillo maillon n suivan suivant t de la liste, liste, -- -1 s’il n’y en a pas next INTEGER INTEGER ); -- Type Type tablea tableau u conten contenant ant les maillo maillons ns de la liste liste TYPE TYPE TREE TREE IS VARR VARRAY AY (19) (19) OF CELL CELL; ; -- Tablea Tableau u conten contenant ant les maillo maillons ns de la liste liste t TREE; TREE; -- indi indice ce du prem premie ier r el´ e ´l´ ement ement de la liste liste first integer; integer; -- indi indice ce du dern dernie ier r el´ e ´l´ ement ement de la liste liste last integer; integer; BEGIN t := TREE TREE() (); ; t.extend(19); -- Initialisation FOR FOR i IN 1..1 1..19 9 LOOP LOOP t(i) t(i).d .dat ata a := powe power( r(i, i, 5) mod mod 19 ; t(i).previ t(i).previous ous := i-1; t(i).next t(i).next := i+1; END LOOP; LOOP; firs first t := 1; last last := 19; 19; t(first).p t(first).previ revious ous := -1; t(last).ne t(last).next xt := -1;
66
-- Affichage Affichage DECLARE p intege integer r := first; first; BEGIN WHIL WHILE E p <> -1 LOOP LOOP DBMS_O DBMS_OUTP UTPUT. UT.PUT PUT_LI _LINE( NE(’(’ ’(’ || p || ’, ’ || t(p) t(p).d .dat ata a || ’, ’ || t(p).p t(p).prev reviou ious s || ’, ’ || t(p).n t(p).next ext || ’)’); ’)’); p := t(p).n t(p).next ext; ; END LOOP; LOOP; END; /* Ecrive Ecrivez z la suite suite vous-m vous-m^ eme... e ^me... */ END; /
Inversez l’ordre l ’ordre des ´el´ el´ements ements de la liste, sans changer les l es indices in dices des maillons m aillons (seulement (seulem ent en modifiant modi fiant le chaˆ chaˆınage).
Exercice 5 Utilisez le tri `a bulle pour remettre les ´el´ el´ements ements dans l’ordre. Les indications indicat ions sont les mˆemes emes : ne d´eplacez eplacez pas les maillons, vous n’avez le droit de toucher qu’au chaˆ chaˆınage. Bon courage, l’aspirine n’est pas fournie.
67
2.11 2.11
Util Utilis isat atio ion n PL/S PL/SQL QL
Nous travaillerons travaillerons sur les donn´ees ees A.6 et A.5. Vous n’oublierez pas de placer des commit en des lieux bien choisis.
Exercice 1 Vous remarquerez que les valeurs des numpers de la table PERSONNE forment une s´equence equence de nombres n ombres de 1 `a 21. Utilisez une boucle dans laquelle vous placerez une requˆ ete ete pour p our recopier les couples nom/pr´ enom enom de la table personne dans la table CLIENT.
Exercice 2 Ecrivez un script r´ ecup´ ecup´erant erant le client de cl´e primaire primair e la plus ´elev´ elev´ee, ee, et injectant injecta nt ce client dans la table PERSONNEL.
Exercice 3 Ouvrez un compte courant pour chaque personne, effectuez un d´epˆ epˆot ot en esp` es p`ece ec e ´egal eg al `a numpers ∗ 100 euros.
Exercice 4 Ouvrez un livret pour chaque personne ayant un numpers pair, faites un virement de leur compte courant vers ce livret de sorte qu’il ne reste plus que 500 sur leur compte.
68
2.12 2.12
Exce Except ptio ions ns
Nous utiliserons les donn´ ees ees de A.7 et A.5 Vous Vou s ˆetes et es invi in vit´ t´es es `a modi m odifier fier le code cod e de d e la l a s´eance ean ce pr´ p r´ec´ ec´edente. edent e. Chaque Chaq ue fois foi s qu’u q u’un n SELECT ser a effectu effe ctu´´e, e, SELECT ... INTO INTO ... sera vous rattraperez les exceptions NO DATA FOUND et TOO MANY ROWS. A chaque insertion, vous ratrapperez l’exception DUP VAL ON INDEX.
Exercice 1 Faites de sorte que les scripts important les donn´ees ees des tables CLIENT ne puissent pui ssent ˆetre etr e ex´ecut´ ecut ´es es qu’une qu’u ne seule seul e fois. foi s.
Exercice 2 Les scripts remplissant la table Operation ne fonction f onctionneront neront pas aujourd’hui... aujourd ’hui... Mˆ eme eme s’il s ’il fonctionnaient foncti onnaient la derni` d erni`ere ere fois. Trouvez les codes d’erreurs des exceptions lev´ees ees par ces scripts, rattrapez-les de la fa¸con la plus appropri´ee ee qui soit.
69
2.13 2.13
Sous Sous-p -pro rogr gram amme mess
Exercice 1 Ecrire une fonction foncti on r´ecursive ecursive retournant retourn ant bn , avec n entier positif ou nul.
Exercice 2 Am´eliorer elio rer la foncti fon ction on pr´ec´ ec´edente edent e en e n util u tilisa isant nt le l e fait f ait que bn = (b2 )
n
2
si n est pair. Pour les questions suivantes, suivantes, utilisez les donn´ees ees de A.5.
Exercice 3 Ecrire une u ne fonction fonct ion demi-freres dem i-freres prenant deux d eux num´eros eros de personnes person nes en param`etre etre et retournant retourna nt vrai si s i et seulement se ulement si ces deux personnes ont un parent en commun.
Exercice 4 Ecrire une fonction cousins germains prenant deux num´ eros eros de personnes en param` etre etre et retournant vrai si et seulement si ces deux deux individus sont cousins germains.
Exercice 5 Ecrire Ecri re une u ne proc´ p roc´edure edur e r´ecursive ecur sive affichant afficha nt le nom de la l a perso p ersonne nne dont le num´ nu m´ero ero est pass´e en param` para m`etre etre et se rapp r appell ellant ant r´ecursivement ecursivement sur le p` ere ere de cette personne. person ne. Faites de sorte `a ne pas utiliser d’exceptions.
Exercice 6 Ecrire une proc´edure edure r´ ecursive ecursive affichant les l es noms n oms des d es ascendants a scendants de sexe s exe masculin m asculin de la l a personne p ersonne dont le l e num´ero ero est es t pass´ pa ss´e en param pa ram``etre. et re.
Exercice 7 Ecrire une fonction fonctio n r´ ecursive ecursive prenant deux num´eros eros de personne perso nne A et B et retournant vrai si A est un ascendant de B .
Exercice 8 Ecrire une fonction fonctio n prenant p renant en param` p aram`etre etre deux num´eros eros de personne p ersonne A et B et retournant, si l’un est un ascendant de l’autre l’au tre,, le nombre nomb re de g´en´ en´eration erat ionss les s´eparant, epar ant, −1 si l’un n’est pas un ascendant de l’autre.
Exercice 9 Pr´eparez eparez un verre d’aspirine d’aspir ine et ´ecrivez ecrivez une requˆete ete retournant retourna nt le(s) couples(s) couples (s) personnes perso nnes s´epar´ epar´ees ees par le plus de g´en´erat ra tions.
Exercice 10 Reprendre Reprendr e le code du tp pr´ec´ ec´edent, edent, le d´ecouper ecoup er en sous-programmes sous-pr ogrammes de la fa¸con con la moins inintelligente possible. Bon courage.
70
2.14 2.14
Curs Curse eurs urs
Exercice 1 Refaites les exercices de 2.11 en utilisant les curseurs.
Exercice 2 En utlisant les donnees A.5, ecrivez une fonction affichant toute la descendance d’une personne.
71
2.15
Curseurs parametr´ es es
L’int´erˆ erˆet et de ces exercices ´etant etant de vous familiariser familia riser avec les curseurs param´etr´ etr´es, es, vous ferez en sorte de ne pas contourner leur usage. Nous utiliserons les donn´ ees ees de A.6
Exercice 1 Ecrire une proc´ pro c´ edure edure qui affiche tous les clients, et p our chaque client, la liste des comptes.
Exercice 2 Ecrire une proc´edure edure qui affiche tous les clients, et p our chaque client, la liste des comptes, et pour chacun de ces comptes, comptes , l’histor l ’historique ique des op´erations. eration s.
72
2.16 2.16
Trigg rigger erss
Impl´ementez ementez les contraintes contraintes suivantes suivantes dans les donn´ ees ees de les donn´ees ees de A.8. Vous ferez des sous-programmes tenant sur une page, et ne contenant contenant pas plus de trois niveaux d’imbrication. Vous r´ epertorierez epertorierez les num´ eros eros d’erreurs que vous affecterez `a chaque lev´ee ee d’exception. d’except ion. 1. Il ne doit pas ˆetre etre possible de modifier la note min dans la table prerequis. 2. Dans un module, il ne doit pas y avoir plus de effecMax ´el` el `eves eves insc in scri rits ts.. 3. On ne peut cr´ eer eer un examen pour p our un module que s’il y a des ´el` el` eves eves inscrits dans ce module. 4. Un ´el` el`eve eve ne peut passer un examen que si sa date d ate d’inscription d’inscri ption est ant´erieure erieure `a la date de l’examen. 5. Il ne doit pas y avoir de circuit dans la table prerequis (il existe une fa¸con con de la v´ erifier erifier en PL/SQL, mais comme vous ne la connaissez pas, faites un parcours en profondeur du graphe des pr´e-requis) e-requis) 6. Un ´el` el`eve eve s’ins s’i nscri crivant vant `a un module doit avoir eu au moins la note min `a tous t ous les modules modu les pr´e-requis. e-requis . 7. Ajouter dans ´etudiant etudiant un champ moyenne, celui-ci contiendra la moyenne de chaque ´etudiant etudiant s’il a pass´ e les examens de tous les modules dans lesquels il est inscrit. 8. Revenez sur la premi` ere ere contrainte : il ne doit ˆetre etre possible de modifier une note min dans la table prerequis que s’il n’exist n’e xistee pas p as d’´el` el`eve eve dont une inscrip ins criptio tion n serai s eraitt invalid´ i nvalid´ee. ee. 9. Il ne doit ˆetre etre possib p ossible le de modifier effecMax que si des ´etudiants etudiants ne se retrouve retrouvent nt pas avec avec une inscription inscription inval in valid id´´ee. ee . Libre `a vous par la suite de trouver d’autres contraintes et de les impl´ ementer. ementer.
73
2.17 2.17
Pack ackages ages
Exercice 1 Lancez deux sessions simultan´ ement ement sur le mˆ eme eme serveur et invoquez les sous-programmes du package package compteur depuis depuis chacune chacune des sessions. sessions. Que remarquez remarquez-vo -vous us ?
Exercice 2 Impl´ementer ementer le corps du package p ackage suivant (utilisez (util isez les donn´ees ees de A.5). CREATE OR REPLACE PACKAGE g e s t i o n a r b r e c i r c u i t exception ;
cursor fe ui ll es
IS
r e t u r n p e rs r s o nn nn e% e%r ow ow ty ty pe pe ;
proce dure ajout ePer sonn e (no (nom personn e .nom .nom%type , prenom prenom person ne . preno prenom m%type , pere personn e . pere%type pere%type , mere mere personn e . mere mere%type ); p r o c e d u r e m o d i f i e P a r e n t s ( p e r s p e r s o n n e . n um um p pe e rs rs%t y p e , numPer numPere e per son ne . per e%type e%type , numM numMer ere e per son ne . mere%type mere%type ) ; END g e s t i o n a r b r e ;
/
74
2.18
R´ evisions evision s
Impl´ementez ementez les contraintes suivantes dans les donn´ees ees de A.9. 1. Les parents p arents d’une mˆeme eme personne p ersonne sont des de s personnes p ersonnes diff´erentes. erentes. 2. L’arbre g´en´ en´ealogique ealogiq ue ne contient pas de circuit. 3. Les dates de divorce sont ult´erieures erieures aux dates de mariage. 4. Une mˆeme eme personn per sonnee ne n e peut p eut pas ˆetre etr e mari´ m ari´ee ee `a plusieur p lusieurss personnes person nes simultan´ement. ement. 5. Personne ne peut ˆetre etre p`ere ere d’une personne perso nne et m`ere ere d’une autre. 6. Un mari ne peut pas ˆetre etre m`ere ere et une femme ne peut pas ˆetre etre p`ere. ere. 7. Deux personnes personnes ayant ayant du sang en comm commun un ne peuvent peuvent se marier. marier.
75
Chapitre 3
Corrig´ es 3.1
Contraintes d´ eclaratives eclaratives
−− q ue u e st s t io i o ns ns 1 , 2 e t 3 DROP TABLE DROP TABLE DROP TABLE DROP TABLE DROP TABLE
CREATE TABLE PRODUIT (numprod nu numb mber er PRIMARY KEY, nomprod varchar2 ( 3 0 ) ) ; CREATE TABLE FOURNISSEUR (numfou nu numb mber er PRIMARY KEY, nomfou varchar2 ( 3 0 ) ) ; CREATE TABLE PROPOSER (numfou number , numprod number , p r i x numb number er NOT NULL, (numfou , numpr numprod) od) , PRIMARY KEY (numfou FOREIGN KEY (numfou) REFERENCES fo ur ni ss eu r (numfou) , FOREIGN KEY (numprod) REFERENCES pr od ui t (numprod ) ) ; CREATE TABLE LIVRAISON (numfou number , numli number , d a t e l i d at at e d e f a u l t s y s d a t e , (numfou , numli ) , PRIMARY KEY (numfou FOREIGN KEY (numfou) REFERENCES fo ur ni ss eu r
(numfou ) ) ;
CREATE TABLE DETAILLIVRAISON (numfou number , numli number , numprod number , q t e numb number er NOT NULL, (numfou , numli , numpro numprod d) , PRIMARY KEY (numfou (numfou , numli ) REFERENCES l i v r ai s on (numfou (numfou , numli ) , FOREIGN KEY (numfou numprod) REFERENCES pr op os er (numfou , numprod numprod ) ) ; FOREIGN KEY (numfou , numprod)
−− q u e s t i on on 4 INSERT INSERT INSERT INSERT
INTO INTO INTO INTO
PRODUIT PRODUIT PRODUIT PRODUIT
INSERT INSERT INSERT INSERT
INTO INTO INTO INTO
FOURNISSEUR FOURNISSEUR FOURNISSEUR FOURNISSEUR
INSERT INSERT INSERT INSERT
INTO INTO INTO INTO
PROPOSER PROPOSER PROPOSER PROPOSER
values values values values
(1 , (2 , (3 , (4 ,
values values values values
values values values values
(1 , (1 , (2 , (3 ,
LIVRAI AISO SON N (numfou , INSERT INTO LIVR LIVRAI AISO SON N (numfou , INSERT INTO LIVR LIVRAI AISO SON N (numfou , INSERT INTO LIVR
’ Ro R ou e d e s e c o u r s ’ ) ; ’ Poup´ ee e e Batma Batman n ’ ); ’ C ot o t on on s t i g e s ’ ) ; ’ Cornichons ’ ); (1 , (2 , (3 , (4 , 1, 2, 2, 3,
’ f1 ’ f2 ’ f3 ’ f4
’ ); ’ ); ’ ); ’ );
2 0 0 ); ); 15); 1); 2);
numl i ) values ( 1 , 1 ) ; numl i ) values ( 1 , 2 ) ; numl i ) values ( 3 , 1 ) ;
INSERT INTO DETAILLIVRAISON values ( 3 , INSERT INTO DETAILLIVRAISON values ( 1 ,
1 , 3 , 10); 1 , 1 , 25);
76
INSERT INTO DETAILLIVRAISON values ( 1 , INSERT INTO DETAILLIVRAISON values ( 1 , INSERT INTO DETAILLIVRAISON values ( 1 ,
1 , 2 , 20); 2 , 1 , 15); 2 , 2 , 17);
−− q u e s t i on on 5 −− −− −− −−
Le s c r i p t c i − d es e s so s o u s v a v ou ou s a f f i c h e r l a s o l u t i o n . V ou ou s p o u v e z p r o c e ´ d e r d e d e u x f a ¸c on on s : ∗ c o p i e r − c o l l e r c e t t e s o l u t i o n a f f i c h ´ ee par ce tt e s´ e r ie de comma er command ndes es
s et und o f f ad i ng ng o f f s et h e ad ee d o f f s et f ee e r t ab a b le le s e l e c t ’ a l t er
’ | | t a b l e n a m e | | ’ d r o p c o ns n s t r ai ai n t ’ c o n s t r a i n t n a m e | | ’ ; ’ from u s e r c o n s t r a i n t s where t a b l e n a m e i n ( ’PROD ’PRODUI UIT T ’ , ’FOURN ’FOURNIS ISSE SEUR’ UR’ , ’PROP ’PROPOSER’ , ’ LIVRAIS LIVRAISON ON ’ , ’DETAILLI ’DETAILLIVRA VRAISO ISON N’) a i n t t y p e IN ( ’ R ’ , ’ P ’ ) AND c o n s t r ai a i n t t y p e DESC ; ORDER BY c o n s t r ai s et und on s et h e a d i n g on s et f e e d on
||
−− ∗ p l ac a c er e r c e ci ci d a n s l e f i c h i e r d p . s q l −− e t l ’ e x e ´ c u t e r e n s a i s i s s a n t @/d p . s q l
t ri r i mo m o ut ut o f f ; f ee ee d o f f ; e c ho ho o f f ; h ea ea di di ng ng o f f ; t er er mo mo ut ut o f f ; verify off ; s p ac ac e 0 ; NEWPAGE 0 ; PAGE PAGESI SIZE ZE 0 ; spo oo o l d r o p c o n s t r ai ai n t s . l s t e r t ab a b le l e ’ | | t a b l e n a m e | | ’ d r o p c o ns n s t r ai ai n t ’ s e l e c t ’ a l t er c o n s t r a i n t n a m e | | ’ ; ’ from u s e r c o n s t r a i n t s where t a b l e n a m e i n ( ’PRODU ’PRODUIT’ IT’ , ’FOURN ’FOURNIS ISSE SEUR’ UR’ , ’PRO ’PROPOSER’ , ’LIVRAISON ’LIVRAISON ’ , ’DETAILLI ’DETAILLIVRA VRAISO ISON N’) a i n t t y p e IN ( ’ R ’ , ’ P ’ ) AND c o n s t r ai a i n t t y p e DESC ; ORDER BY c o n s t r ai s po p o ol ol o f f @drop constraints . lst s et t r i m o u t on ; Se t f e e d on ; s et echo on ; s et h e a d i n g on ; s et termout on ; s et v e r i f y on ; s et Se t s et s et s et s et set SET SET
||
on 6 −− q u e s t i on a l t e r t a bl bl e p r o d u i t add constraint p k p r o d u i t PRIMARY KEY (numprod ) ; a l t e r t a bl bl e f o u r n i s s e u r add eu r c o n s t r a i n t p k f o u r n i s s eu (numfou ) ; PRIMARY KEY (numfou a l t e r t a bl bl e p r o p o s e r add constraint p k p r o p o s e r numprod ) ; PRIMARY KEY (numfou , numprod a l t e r t a bl bl e l i v r a i s o n add so n c o n s t r a i n t p k l i v r a i so (numfou u , numli ); PRIMARY KEY (numfo a l t e r t a bl bl e d e t a i l l i v r a i s o n add i l l i v r ai ai s o n c o n s t r a i n t p k d e t a il (numfou , numli , numpr numprod od ) ; PRIMARY KEY (numfou a l t e r t a bl bl e p r o p o s e r add constraint f k p r o p o s e r f o u r n i s s e u r FOREIGN KEY (numfou)
REFERENCES fo ur ni ss eu r (numfou (numfou ) ; a l t e r t a bl bl e p r o p o s e r ad d c o n s t r a i n t f k p r o p o s e r p r o d u i t FOREIGN KEY (numprod)
REFERENCES pr od ui t ( numprod ) ; a l t e r t a bl bl e l i v r a i s o n add c o n s t r a i n t FOREIGN KEY (numfou)
fk livraison
REFERENCES fo ur ni ss eu r (numfou (numfou ) ; a l t e r t a bl bl e d e t a i l l i v r a i s o n ad d c o n s t r a i n t (numfou u , numli) FOREIGN KEY (numfo
REFERENCES l i v ra i s on
fk detail livraison
(numfou (numfou , numli ) ; f k d e t a i l l i v r a i s o n p r o p o se r
a l t e r t a bl bl e d e t a i l l i v r a i s o n ad d c o n s t r a i n t numprod) FOREIGN KEY (numfou , numprod)
REFERENCES pr op os er (numfou , numprod numprod ) ;
77
3.2
Introduction aux requˆ requˆ etes etes
−− E x er e r c i ce ce 1 SELECT nomMod FROM MODULE;
−− E x er e r c i ce ce 2 SELECT DISTINCT numModPrereq FROM PREREQUIS
−− E x er e r c i ce ce 3 SELECT nomMod FROM MODULE WHERE numMod IN ( 1 ,
3, 5);
−− E x er e r c i ce ce 4
SQL> SELECT ∗ FROM MODULE WHERE nom nomMod = ’ Algo ava nc´ee ee ’ ; NUMMOD NOMMOD −−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 8 Algo avanc´ee 1 li gne
s´ el ec ti onn ´ ee .
SQL> UPDATE p r e r e q u i s SET noteMin = 12 WHERE nu numM mMod od = 8 ; SQL> SELECT ∗ Mod = ’PL/S ’PL/SQL QL Or ac le ’ ; FROM module WHERE nomMod NUMMOD NOMMOD −−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 6 PL/S L/SQL Ora cle 1 li gne s´ el ec ti onn ´ ee . SQL> UPDATE p r e r e q u i s SET noteMin = 11 WHERE nu numM mMod od = 6 ; −− E x er e r c i ce ce 5
numModPrere rereq q, SELECT numModP FROM PREREQUIS numM mMod od = 6 WHERE nu ORDER BY noteMin ;
noteMin
−− E x er e r c i ce ce 6 SELECT numMod FROM p r e r e q u i s numModPrereq ereq = 5 WHERE numModPr AND noteMin > 1 0 ;
e r c i ce ce 7 −− E x er SELECT nomMod FROM module WHERE nomMod LIKE ’%Algo%’ ’%SQL% ’ ; OR nomMod LIKE ’%SQL
−− E x er e r c i ce ce 8 DELETE FROM i n t e r v a l l e WHERE borneSup < b o r n e I n f ;
−− E x er e r c i ce ce 9 DELETE FROM r e c t a n g l e xHautGau auche che = xBasDroit WHERE xHautG yHautGauche che = yBasDr oit ; OR yHautGau
−− E x e r c i c e 1 0 SELECT ∗ FROM i n t e r v a l l e WHERE 10 BETWEEN b o r n e I n f AND borneSup ;
−− E x e r c i c e 1 1 SELECT ∗ FROM i n t e r v a l l e WHERE b o r n e I n f <= 5 AND borneSup >= 7 ; SELECT ∗ FROM i n t e r v a l l e WHERE b o r n e I n f >= 5 AND borneSup <= 3 5 ; SELECT ∗
78
FROM i n t e r v a l l e WHERE ( 15 BETWEEN b o r n e I n f AND borneSup) OR ( 20 BETWEEN b o r n e I n f AND borneSup) OR ( b o r n e I n f BETWEEN 15 AND 2 0 ) ;
−− E x e r c i c e 1 2 SELECT ∗ FROM r e c t a n g l e WHERE (xHautGauche > x B a s D r o i t ) OR (yHautGauche < yBasDroit );
−− E x e r c i c e 1 3 UPDATE r e c t a n g l e SET
xHautGau xHautGauche che = xBasDroit , xBasDr oit = xHautGauch xHautGauche e WHERE xHautGauche > xBasDroit ; UPDATE r e c t a n g l e SET
yHautGau yHautGauche che = yBasDroit , yBasDr oit = yHautGauch yHautGauche e WHERE yHautGauche < yBasDroit ; −− E x e r c i c e 1 4 SELECT ∗ FROM r e c t a n g l e WHERE ( 2 BETWEEN xHautGauche AND x B a s D r o i t ) AND ( 2 BETWEEN yBasDroit AND yHautGauche ) ;
79
3.3 3.3
Join Jointu ture ress
e r c i ce ce 1 −− E x er SELECT di st in ct nomprod ui t , p r o p o s e r FROM p r o d ui .numprod od = prop oser .numpr .numprod; od; WHERE prod uit .numpr
−− E x er e r c i ce ce 2 SELECT di st in ct nomfou op o se se r p FROM f o u r n i s s e u r f , p r op WHERE f .numfou = p.numfou;
−− E x er e r c i ce ce 3
nomprod SELECT nomfou , nomprod o d u it it p , FROM f o u r n i s s e u r f , p r od numfou = pr . numfou numfou WHERE f . numfou numprod od = p . numpr numprod; od; AND pr . numpr
p r op o p os os e r p r
−− E x er e r c i ce ce 4
om fo fo u , p r i x SELECT n om o d u it it p , FROM f o u r n i s s e u r f , p r od numfou = pr . numfou numfou WHERE f . numfou numprod od = p . numpr numprod od AND pr . numpr nomProd = ’ Poup´ee e e Batman Batman ’ AND nomProd ORDER BY p r i x ;
p r op o p os os e r p r
−− E x er e r c i ce ce 5 SELECT d a t e l i a i s o n l , f o ur u r n is i s s eu eu r FROM l i v r ai .numfou u = f .numfo .numfou u WHERE l .numfo .nomFou ou = ’ f1 ’ ; AND f .nomF
f
−− E x er e r c i ce ce 6 SELECT nomprod u r n is i s s eu e u r f , p ro r o du d u it it p , FROM f o ur nomfou u = ’ f3 ’ WHERE nomfo .numfou u = l .numfo .numfou u AND f .numfo AND l .numfou = d.numfou um mli AND l . n u m llii = d . n u numprod od = p . numpr numprod od AND d . numpr AND d a t e l i < s y s d a t e ;
d e t a i l l i vr a i s o n d ,
l i v r ai ai s o n l
−− E x er e r c i ce ce 7
um fo fou , l . n um um li li , d a t e l i SELECT l . n um r o du d u it i t p , l i v r ai ai s o n l , d e t a i l l i vr a i s o n d FROM p ro numprod od = d . numpr numprod od WHERE p . numpr AND l .numfou = d.numfou um mli AND l . n u m llii = d . n u nomprod = ’ Poup´ ee e e Batma Batman n’; AND p . nomprod −− E x er e r c i ce ce 8
.nom, enf . preno prenom m SELECT enf .nom, rs o n nn n e s f , p e rs rs o n nn ne enf FROM p e rs numpers ers WHERE enf . mere = sf . nump re no no m = ’ S o f i a ’ ; AND s f . p re −− E x er e r c i ce ce 9
.nom, par . preno prenom m SELECT par .nom, nn e e d , p e r s on on n e p a r FROM p e r s o nn numpers OR ed . mere = par . numpers numpers ) WHERE (ed . pere = par . numpers om = ’ D i j k s t r a ’ ; AND e d . n om −− E x e r c i c e 1 0
.nom, e . prenom prenom SELECT e .no rs o n nn n e e , p e rs rs o n nn ne p, FROM p e rs numpers ers WHERE e . pere = p. nump AND e . mere = m. numpers ’Bach ’ AND p. nom = ’Bach m.nom = ’Mathieu ’ ; AND m.no
p e rs rs o nn nn e m
−− E x e r c i c e 1 1
.nom, f . prenom prenom SELECT f .nom, rs o n nn n e f , p e rs rs o n nn ne j FROM p e rs WHERE f . p e r e = j . p e r e AND f . mere = j . mere nom = ’ La La F r i p o u i l l e ’ AND j . no AND j .nom <> f .nom;
80
−− E x e r c i c e 1 2
.nom, c . prenom prenom SELECT c .no rs o n nn n e c , p e rs rs o n nn ne o , FROM p e rs om = ’ D i j k s t r a ’ WHERE d . n om nu mp mp er er s AND d . p e r e = p . nu AND p . p e r e = o . p e r e AND p. mere = o . mere numpers <> o . numpers AND p . numpers numpers ; AND c . pere = o . numpers
p e rs rs o nn n n e p , p e rs r s o nn nn e d
−− E x e r c i c e 1 3
nom, dm. prenom SELECT dm. nom, rs o n nn n e dm dm , p e rs rs o n nn n e l f , p e rs r s o nn nn e p FROM p e rs nom = ’ F a b i a n ’ WHERE l f . no um p pe ers = l f . pere AND p . n um mere AND p . mere = dm. mere numpers <> dm. numpers ; AND p . numpers −− E x e r c i c e 1 4
re no no m SELECT p . nom , p . p re rs o n nn n e p , p e rs rs o n nn n e kb , FROM p e rs ’Bush ’ WHERE kb. nom = ’Bush mere = kb. numpe numpers rs AND enf . mere numpers rs ; AND enf . pere = p. numpe
p e rs r s o nn nn e e n f
−− E x e r c i c e 1 5
.nom, nev . prenom prenom SELECT nev .nom, rs o n nn n e n e v , p e rs r s o nn nn e j l c , p e rs r s o nn nn e f r FROM p e rs re no no m = ’ J a c q o u ’ WHERE j l c . p re AND f r . p e r e = j l c . p e r e re = j l c . m er er e AND f r . m e re numpers <> j l c . numpers numpers AND fr . numpers numpers OR nev . mere mere = fr . numper numperss ); ANd (nev . pere = fr . numpers −− E x e r c i c e 1 6 SELECT m.nom, m. prenom rs o n nn n e a r , p e rs rs o n nn ne f , FROM p e rs numperss WHERE f . pere = ar . numper .nom = ’ Rieu ’ AND ar .nom AND f . mere = m. numpers ;
p e rs r s o nn nn e m
−− E x e r c i c e 1 7
nom, gp . prenom SELECT DISTINCT gp . nom, rs o n nn n e s h , p e rs rs o n nn n e p , p e rs r s o nn nn e g p FROM p e rs .nom = ’ Stone ’ WHERE sh .nom AND ( ( sh . pere = gp . numpers) numpers) numpers ) OR ( sh . mere = gp . numpers OR ( (sh . mere = p . numper numperss OR sh . pere = p. nump numpers) ers) numpers OR p. pere = gp . numper numpers) s) AND (p . mere = gp . numpers ) );
81
3.4
Agr´ egation egat ion de donn´ do nn´ ees ees
−− E x er e r c i ce ce 1 SELECT COUNT( ∗ ) FOURNISSEUR;; FROM FOURNISSEUR
−− E x er e r c i ce ce 2 SELECT COUNT(DISTINCT NUMFOU) LIVRAISON ; FROM LIVRAISON
−− E x er e r c i ce ce 3 SELECT MAX( prix ) AS PRIX MAX PROPOS OSER ER PR , FOURNIS FOURNISSEUR SEUR F FROM PROP numfou = PR. numfou numfou WHERE F. numfou nomfou u = ’ f1 ’ ; AND nomfo
e r c i ce ce 4 −− E x er SELECT nomfou , count (DISTINCT numprod) AS NB PROD PROPOSES FOURNISSEUR EUR F , PROP PROPOS OSER ER P FROM FOURNISS numfo mfou u = P . nu numf mfou ou WHERE F. nu GROUP BY nomfou ;
−− E x er e r c i ce ce 5
numprod) d) − count (DISTINCT PR. numprod) numprod) SELECT COUNT(DISTINCT P. numpro PRODUIT IT P , PROP PROPOS OSER ER PR; PR ; FROM PRODU −− E x er e r c i ce ce 6
numfou) SELECT nomprod , COUNT(DISTINCT D. numfou) PRODUI UIT T P , DETAILLI DETAILLIVRAIS VRAISON ON D FROM PROD numprod od = D. numpr numprod od WHERE P. numpr nomprod ; GROUP BY nomprod −− E x er e r c i ce ce 7
om fo fo u , L . n u m mll i , d a t e l i , COUNT(numprod) AS NB PRODUITS SELECT n om FOURNI NISS SSEU EUR R F , LIVRAISO LIVRAISON N L , DETAIL DETAILLIV LIVRAI RAISON SON D FROM FOUR WHERE F.numfou = L.numfou numfo mfou u = L. nu numf mfou ou AND D. nu AND D. numli = L. numli om fo fo u , L . n u m mll i , d a t e l i ; GROUP BY n om −− E x er e r c i ce ce 8
om fo fo u , L . n u m mll i , d a t e l i , SUM( qte ∗ p r i x ) AS TOTAL SELECT n om FOURNI NISS SSEU EUR R F , LIVRAISO LIVRAISON N L , DETAIL DETAILLIV LIVRAI RAISON SON D , PROPOSER P FROM FOUR WHERE F.numfou = L.numfou numfo mfou u = L. nu numf mfou ou AND D. nu AND D. numli = L. numli numfo mfou u = F . nu numf mfou ou AND P. nu numprod od = P . numpro numprod d AND D. numpr om fo fo u , L . n u m mll i , d a t e l i ; GROUP BY n om −− E x er e r c i ce ce 9 SELECT nomprod PRODUIT IT P , PROP PROPOS OSER ER PR FROM PRODU numprod = PR. PR. numprod numprod WHERE P. numprod GROUP BY nomprod D. n um um fo fo u ) = 1 ; HAVING COUNT( D.
−− E x e r c i c e 1 0 SELECT nomfou FOURNISS ISSEUR EUR F , PROP PROPOS OSER P , DETAILLIV DETAILLIVRAISO RAISON N L FROM FOURN numfo mfou u = P . nu numf mfou ou WHERE F. nu AND L.numfou = F.numfou GROUP BY nomfou nump mpro rod) d) = COUNT(DISTINCT L. numpr numprod od ); HAVING COUNT(DISTINCT P. nu
82
3.5
Vues
e r c i ce ce 1 −− E x er CREATE VIEW QUANTITE LIVREE PAR PRODUIT AS QUANTITE LIVREE SELECT numprod , SUM( qte ) AS QUANTITE FROM DETAILLIVRAISON numprod; GROUP BY numprod;
−− E x er e r c i ce ce 2 SELECT MAX(QUANTITE LIVREE) LIVREE PAR PRODUIT; PRODUIT ; FROM QUANTITE LIVREE
−− E x er e r c i ce ce 3 CREATE VIEW FACTURE PAR LIVRAISON AS numfou , D. numli , SUM( qte ∗ p r i x ) AS MONTANTFACTURE MONTANT FACTURE SELECT D. numfou PROPOS OSER PR , DETAILLIVRAiS DETAILLIVRAiSON ON D FROM PROP numfou = D. numfou numfou wHERE PR. numfou numprod = PR. numprod numprod AND D. numprod numfou , D. numli ; GROUP BY D. numfou
−− E x er e r c i ce ce 4 CREATE VIEW FACTURE PAR FOURNISSEUR AS SELECT numfou , SUM(MONTANT FACTURE) AS TOTAL FACTURE FROM FACTURE PAR LIVRAISON numfou; GROUP BY numfou;
−− E x er e r c i ce ce 5 SELECT MIN(TOTAL FACTURE) FOURNISSEUR;; FROM FACTURE PAR FOURNISSEUR
−− E x er e r c i ce ce 6 CREATE VIEW NB PROD DIST LIVRES PAR FOU AS SELECT DISTINCT numfou , COUNT(DISTINCT numprod) AS NB PRODUITS DISTINCTS LIVRES FROM DETAILLIVRAISON numfou; GROUP BY numfou; SELECT MAX(NB PRODUITS DISTINCTS LIVRES) LIVRES PAR FOU ; FROM NB PROD DIST LIVRES
83
3.6 3.6
Requˆ Req uˆ etes ete s imbriqu´ imbr iqu´ees ees
−− E x er e r c i ce ce 1 SELECT nomfou , (SELECT COUNT(numprod) FROM PROPOSER P numf mfou ou = F. nu numf mfou ou WHERE P. nu ) AS NB PROD PROPOSES FOURNISSEUR EUR F ; FROM FOURNISS
−− E x er e r c i ce ce 2 SELECT nomfou FROM FOURNISSEUR WHERE numfou IN (SELECT numfou FROM PROPOSER nump mpro rod d = 2) ; WHERE nu
−− E x er e r c i ce ce 3 SELECT nomfou FROM FOURNISSEUR WHERE numfou IN (SELECT numfou FROM PROPOSER numprod = WHERE numprod (SELECT numprod FROM PRODUIT ee e e Batman Batman ’ WHERE nomprod = ’ Poup´
) ); e r c i ce ce 4 −− E x er SELECT nomfou FROM FOURNISSEUR WHERE numfou IN (SELECT numfou FROM DETAILLIVRAISON WHERE numprod IN (SELECT numprod FROM PRODUIT ee e e Batman Batman ’ WHERE nomprod = ’ Poup´
) ); −− E x er e r c i ce ce 5 SELECT nomfou FOURNISSEUR EUR F FROM FOURNISS WHERE (SELECT COUNT( ∗ ) FROM PROPOSER PR numfou = PR. numfou numfou WHERE F. numfou
)
>
0
AND
(SELECT COUNT(DISTINCT numprod) FROM DETAILLIVRAISON D numf mfou ou = D. nu numf mfou ou WHERE F. nu ) = (SELECT COUNT( ∗ ) FROM PROPOSER PR numfou = PR. numfou numfou WHERE F. numfou ); −− E x er e r c i ce ce 6 SELECT nomfou , (SELECT nomprod PRODUIT P FROM PRODUIT numprod IN WHERE P. numprod (SELECT numprod PROPOSER PR1 FROM PROPO numfou = F . numfou numfou WHERE PR1. numfou AND p r i x = (SELECT MAX( prix ) FROM PROPOSER PR2 numfou = F. numfou numfou WHERE PR2. numfou
) ) ) FOURNISSEUR EUR F ; FROM FOURNISS −− E x er e r c i ce ce 7
84
CREATE VIEW NB PROD LIVRES PAR FOU AS SELECT numfou , numprod , SUM( qte ) AS QTE FROM DETAILLIVRAISON numfou , numprod; numprod; GROUP BY numfou
nomprod , nomfou SELECT nomprod FOURNISS ISSEUR EUR F , PROD PRODUI UIT T P FROM FOURN WHERE (SELECT QTE LIVRES PAR FOU D FROM NB PROD LIVRES numprod od = P . numpro numprod d WHERE D. numpr numf mfou ou = F . nu numfo mfou u AND D. nu ) = (SELECT MAX(QTE) LIVRES PAR FOU D FROM NB PROD LIVRES numprod od = P . numpro numprod d WHERE D. numpr ); −− E x er e r c i ce ce 8 SELECT MIN(NB PROD) FROM (SELECT (SELECT COUNT( ∗ ) FROM PROPOSER PR numfou = F . numfou numfou WHERE PR. numfou ) AS NB PROD FOURNISSEU SEUR R F FROM FOURNIS
); −− E x er e r c i ce ce 9 SELECT nomfou FROM FOURNISSEUR WHERE numfou IN (sELECT numfou FROM (SELECT numfou ,
(SELECT COUNT( ∗ ) FROM PROPOSER PR numfou = PR.numfou WHERE F. numfou ) AS NB PROD FOURNISSEUR F FROM FOURNISSEUR ) PROD D = WHERE NB PRO (SELECT MIN(NB PROD) FROM
(SELECT numfou , (SELECT COUNT( ∗ ) PROPOSER R PR FROM PROPOSE numfou = PR. numfou numfou WHERE F. numfou ) AS NB PROD FOURNISSEU SEUR R F FROM FOURNIS ) ) ); −− E x e r c i c e 1 0
nomprod , nomfou SELECT nomprod PRODUI UIT T P , FOURN FOURNISS ISSEU EUR R F, FROM PROD (SELECT F1. numfou numfou , P1. numpro numprod d FOURNISS ISSEU EUR R F1 , PROD PRODUI UIT T P1 FROM FOURN WHERE (SELECT SUM(QTE) DETAILLIVRAiSON SON D FROM DETAILLIVRAi numfo mfou u = F1. nu numfo mfou u WHERE D. nu numprod od = P1. numpr numprod od AND D. numpr ) = (SELECT MAX(NB LIV) FROM
(SELECT numprod , SUM(QTE) AS NB LIV DETAILLIVRAiSON iSON D FROM DETAILLIVRA numprod , numfou GROUP BY numprod ) Q numprod d = P1. numpr numprod od WHERE Q. numpro ) ) M numprod = M.numprod M.numprod WHERE P. numprod numfo mfou u = M.numfo M.numfou u; AND F. nu
85
3.7
Compl´ ements ements sur les types
−− E x er e r c i ce ce 1 ALTER TABLE LIVRAISON ADD CONSTRAINT c k d a t e m a n d a t o r y CHECK ( d a t e l i I S NOT NULL) ; ALTER TABLE PROPOSER ADD CONSTRAINT c k p r i c e m a n d a t o r y CHECK ( p r i x I S NOT NULL) ; ALTER TABLE DETAILLIVRAISON ADD CONSTRAINT c k q t e m a n d a t o r y CHECK ( q t e I S NOT NULL) ;
−− E x er e r c i ce ce 2 ALTER TABLE PROPOSER ADD CONSTRAINT c k p r i c e p o s i t i v e CHECK ( p r i x > 0 ) ; ALTER TABLE DETAILLIVRAISON ADD CONSTRAINT c k q t e p o s i t i v e CHECK ( qte > 0 ) ;
−− E x er e r c i ce ce 3 ALTER TABLE LIVRAISON ADD CONSTRAINT c k o c t o b r e 2 0 0 6 yyyymm ’ ) >= ’ 2 0 0 61 61 0 ’ ) ; CHECK ( t o c h a r ( d a t e l i , ’ yy
−− E x er e r c i ce ce 4 ALTER TABLE LIVRAISON ADD CONSTRAINT c k f e t e d u t r a v a i l mmdd ’ ) <> ’ 0 5 0 1 ’ ) ; CHECK ( t o c h a r ( d a t e l i , ’ mm
−− E x er e r c i ce ce 5 UPDATE PRODUIT SET nomprod nomprod = upper ( s u b s t r ( n om om p prr od od , 1 , 1 ) ) | | substr ( nomprod , 2 , LENGTH(nomprod ) − 1 ) ; ALTER TABLE PRODUIT ADD CONSTRAINT c k m a j u s c u l e p r o d u i t om p prr od od , 1 , CHECK ( upper ( substr ( n om
1 ) ) = substr ( n om om p prr od od , 1 , 1 ) ) ;
UPDATE FOURNISSEUR SET nomfou nomfou = upper ( s u b s t r ( n om om fo fo u , 1 , 1 ) ) | | substr ( nomfou , 2 , LENGTH(no mfou ) − 1 ) ; ALTER TABLE FOURNISSEUR ADD CONSTRAINT c k m a j u s c u l e f o u r n i s s e u r om fo fo u , 1 , 1 ) ) = substr ( n om om fo fou , CHECK ( upper ( substr ( n om
86
1 , 1)) ;
3.8
R´ evisions evision s
e r c i ce ce 1 −− E x er SELECT nomfou FOURNISSEUR EUR F FROM FOURNISS WHERE
( SELECT COUNT( ∗ ) LIVRAISON ON L FROM LIVRAIS numf mfou ou = F. nu numfo mfou u WHERE L. nu
) >=
2;
−− E x er e r c i ce ce 2 CREATE VIEW LIVRAISONS PAR ANNEE AS SELECT ANNEE, COUNT( ∗ ) AS NB LIVRAISONS FROM
( numfou , SELECT t o c h a r ( d a t e l i , ’ y y y y ’ ) AS ANNEE, numfou FROM LIVRAISON
numl i
) ANNEE; GROUP BY ANNEE; SELECT ANNEE FROM LIVRAISONS PAR ANNEE LIVRAISONS = WHERE NB LIVRAISONS
( SELECT MAX(NB LIVRAISONS) FROM LIVRAISONS PAR ANNEE
); −− E x er e r c i ce ce 3 CREATE VIEW FOU KI ONT TOU LIVRE AS SELECT numfou FOURNISSEUR EUR F FROM FOURNISS WHERE (SELECT COUNT( ∗ ) FROM PROPOSER PR numf mfou ou = F. nu numf mfou) ou) WHERE PR. nu
= (SELECT COUNT(DISTINCT numprod) FROM DETAILLIVRAISON D numf mfou ou = F. nu numfo mfou u WHERE D. nu ); CREATE VIEW DERNIERE LI PAR FOU AS DATE MAX MAX SELECT numfou , MAX( d a t e l i ) AS DATE FROM LIVRAISON numfou; GROUP BY numfou; SELECT nomfou FROM FOURNISSEUR WHERE numfou IN
( numfou SELECT F. numfou KI ONT TOU TOU LIVRE LIVRE F, FROM FOU KI numf mfou ou = D. nu numfo mfou u WHERE F. nu MAX = AND DATE MAX
DERNIE DERNIERE RE LI PAR PAR FOU FOU D
( (DATE MAX) MAX) SELECT MAX(DATE FOU KI ONT ONT TOU TOU LIVRE LIVRE F , DERNIE DERNIERE RE LI PAR PAR FOU FOU D FROM FOU numfo mfou u = D. nu numf mfou ou WHERE F. nu ) );
87
3.9 3.9
Exam Examen en Type ype
DROP TABLE DROP TABLE DROP TABLE DROP TABLE DROP TABLE DROP TABLE
x e r ci ci c e 1 e t 3 −− E xe CREATE TABLE ETUDIANT (numEtud number , nom varchar2 ( 4 0 ) , prenom varchar2 ( 4 0 ) , d a t e n a i s s date , c i v i l i t e varchar2 ( 4 ) , patronyme varchar2 ( 4 0 ) , numsecu varchar2 ( 1 5 ) NOT NULL) ; CREATE TABLE MODULE (codMod number , nomMod varchar2 ( 1 5 ) , e f f e c M a x num numbe ber r DEFAULT 3 0 ) ; CREATE TABLE EXAMEN (codMod number , codExam number , dateExam date ) ; CREATE TABLE INSCRIPTION (numEtud number , codMod number , d a t e I n s c d at at e d e f a u l t s y s d a t e ) ; CREATE TABLE PREREQUIS (codMod number , codModPrereq number , noteMin number ( 4 , 2 ) NOT NULL) ; CREATE TABLE RESULTAT (codMod number , codExam number , numEtud number , note number ( 4 , 2 ) ) ;
−− E x er e r c i ce ce 2 ALTER TABLE ETUDIANT ADD CONSTRAINT p k e t u d i a n t (numEtud d); PRIMARY KEY (numEtu ALTER TABLE MODULE ADD CONSTRAINT pk module (codMod d); PRIMARY KEY (codMo ALTER TABLE EXAMEN ADD CONSTRAINT pk examen (codMod d , codE codExa xam m); PRIMARY KEY (codMo ALTER TABLE PREREQUIS ADD CONSTRAINT p k p r e r e q u i s (codMod d , codModPrereq codModPrereq ) ; PRIMARY KEY (codMo ALTER TABLE INSCRIPTION ADD CONSTRAINT p k i n s c r i p t i o n (codMod d , numE numEtu tud d); PRIMARY KEY (codMo ALTER TABLE RESULTAT ADD CONSTRAINT p k r e s u l t a t (codMod d , numE numEtu tud d , codE codExa xam m); PRIMARY KEY (codMo ALTER TABLE INSCRIPTION ADD (CONSTRAINT f k i n s c r i p t i o n e t u d i a n t FOREIGN KEY (numEtud)
REFERENC ERENCES ES ETUD ETUDIAN IANT( T( numEtu num Etud d) , CONSTRAINT f k i n s c r i p t i o n m o d u l e FOREIGN KEY (codMod)
REFE REFERE RENC NCES ES MODULE( codM od ) ) ; ALTER TABLE PREREQUIS ADD (CONSTRAINT f k p r e r e q u i s c o d m o d FOREIGN KEY (codMod)
REFERENC ERENCES ES MODULE( codMo co dMod d) , er e q CONSTRAINT f k p r e r e q u i s c o d m o d p r er FOREIGN KEY (codModPrereq) REFE REFERE RENC NCES ES MODULE( codM od ) ) ; ALTER TABLE EXAMEN ADD CONSTRAINT f k e x a m e n FOREIGN KEY (codMod)
REFERENC ERENCES ES MODULE( codMo co dMod d); ALTER TABLE RESULTAT ADD (CONSTRAINT f k r e s u l t a t e x a m e n (codMod, codExa codExam) m) FOREIGN KEY (codMod,
88
REFE REFERE RENC NCES ES EX EXAMEN( codMod codM od , codE xam ) , CONSTRAINT f k r e s u l t a t i n s c r i p t i o n (codMod, numE numEtud) tud) FOREIGN KEY (codMod,
REF REFEREN RENCES INSCRI INSCRIPTI PTION( ON( codMod , numEtud numEtud ) ) ; −− E x er e r c i ce ce 3 CH HECK q u i n ’ o n t p a s ´ et´ e p l a c ´e e s −− I c i s e t r o u v e l e s c o n s t r a i n t e s d e t y p e C −− a u n i v e au au d e l a t a b l e p ou ou r d e s r a i s o n s d e l i s i b i l i t ´e . ALTER TABLE ETUDIANT ADD (CONSTRAINT c k c i v i l i t e CHECK
( c i v i l i t e IN ( ’Mr’ ’Mr’ , ’Mm ’Mme’ , ’ Mlle ’ ) ), CONSTRAINT c k c i v i l i t e n u m s e c u CHECK
( um se se cu cu , SUBSTR( n um
1 , 1 ) = ’ 2 ’ OR patronyme patronyme IS NULL
), CONSTRAINT c k l e n g t h n u m s e c u CHECK
( l e n g t h ( n u ms ms ec ec u ) = 1 5 ), CONSTRAINT c k a n n e e n u m s e c u CHECK ( t o c h a r ( d a t e n a i s s , ’ y y ’ ) = substr ( n u ms ms ec ec u , 2 , 2 ) ) ); −− I l i m po p o s si s i b le l e d e l i m i t er e r d e f a¸ a¸c o n d ´ ecl ar ati ve −− i n s c ri ri t s ` a un mo od d ul ul e .
l e n om om br br e d ’ ´ etud iant s
−− E x er e r c i ce ce 4 INSERT INTO ETUDIANT VALUES ( (SELECT nvl (MAX(nu (numE mEtu tud) d) ,
’ Fourier ’ , ’ Joseph ’ , to dat e ( ’21031768 ’ , ’Mr ’Mr ’ , NULL, ’ 168031234567890 ’ );
0) + 1 FROM ETUDIANT) ,
’ddm ’ddmmyyyy ’ ) ,
nomMod) d) VALUES INSERT INTO MODULE ( codMod , nomMo ( (SELECT nvl (MAX( c od od M Mo o d ) , 0 ) + 1 FROM MODULE) , ’Maths ’ ); INSCRI RIPT PTIO ION N (codMod , numEtud) numEtud) VALUES INSERT INTO INSC ( (SELECT numEtud FROM ETUDIANT WHERE nom = ’ Four ier ’ ) , (SELECT codMod FROM MODULE WHERE nomMo mMod = ’ Maths ’ )) ; INSERT INTO EXAMEN VALUES
( (SELECT codMod FROM MODULE WHERE nomM nomMod od = ’ Maths ’ ) , 1, to dat e ( ’02012007 ’ , ’ddm ’ddmmyyyy ’ ) ); INSERT INTO RESULTAT VALUES
( (SELECT codMod FROM MODULE WHERE nomM nomMod od = ’ Maths ’ ) , 1, (SELECT numEtud FROM ETUDIANT WHERE nom = ’ Four ier ’ ) , 19 ); UPDATE RESULTAT SET n o t e = 2 0 wHERE numE numEtu tud d = (SELECT numEtud FROM ETUDIANT WHERE nom = ’ Four ier ’ ) codMod od = (SELECT codMod FROM MODULE WHERE nomM nomMod od = ’ Maths ’ ) AND codM codExa xam m = 1; AND codE
−− E x er e r c i ce ce 5 −− re qu ˆ et e 1 et SELECT nom ETUDIANT ; FROM ETUDIANT
−− re qu ˆ e t e 2 et
89
SELECT nom FROM ETUDIANT WHERE numEtud IN
( SELECT numEtud FROM INSCRIPTION WHERE codMod IN
( SELECT codMod FROM MODULE nomMod od = ’ Maths ’ WHERE nomM
) ); −− re qu ˆ e t e 3 et
nom, SELECT nom,
prenom prenom ,
( SELECT MAX(NOTE) RESULTAT R FROM RESULTAT numEtud ud = E. numE numEtud tud WHERE R. numEt codMod = AND codMod
( SELECT codMod FROM MODULE nomMod od = ’ Maths ’ WHERE nomM
) ) AS NOTE DEFINITIVE ETUDIAN ANT T E; FROM ETUDI et e 4 et −− re qu ˆ
prenom SELECT nom, prenom ETUDIANT T E FROM ETUDIAN WHERE 0 (
<=
SELECT co un t ( ∗ ) RESULTAT R FROM RESULTAT numEtud ud = E. numE numEtud tud WHERE R. numEt AND note >= 10 codMod = AND codMod
( SELECT codMod FROM MODULE nomMod od = ’ Maths ’ WHERE nomM
) ); −− re qu ˆ e t e 5 et
prenom SELECT nom, prenom ETUDIANT T E FROM ETUDIAN WHERE ( SELECT co un t ( ∗ ) RESULTAT R FROM RESULTAT numEtud ud = E. numE numEtud tud WHERE R. numEt codMod = AND codMod
( SELECT codMod FROM MODULE nomMod od = ’ Maths ’ WHERE nomM
) ) = 0 ; −− re qu ˆ e t e 6 et CREATE VIEW NOTE MATHS PAR ETU AS numEtud, SELECT numEtud,
( SELECT MAX(NOTE) RESULTAT R FROM RESULTAT numEtud ud = E. numE numEtud tud WHERE R. numEt codMod = AND codMod
( SELECT codMod FROM MODULE nomMod od = ’ Maths ’ WHERE nomM
) ) AS NOTE MATHS ETUDIAN ANT T E; FROM ETUDI prenom SELECT nom, prenom FROM ETUDIANT WHERE numEtud IN (
90
SELECT numEtud FROM NOTE MATHS PAR ETU WHERE NOTE MATHS
= ( SELECT MAX(NOTE MATHS) FROM NOTE MATHS PAR ETU
) ); e t e 7 et −− re qu ˆ CREATE VIEW NOTE MIN MATHS PAR ETU AS numEtud, SELECT numEtud,
( SELECT MIN(NOTE) RESULTAT R FROM RESULTAT numEtud ud = E. numE numEtud tud WHERE R. numEt codMod = AND codMod
( SELECT codMod FROM MODULE nomMod od = ’ Maths ’ WHERE nomM
) ) AS NOTE MATHS ETUDIAN ANT T E; FROM ETUDI prenom SELECT nom, prenom FROM ETUDIANT WHERE numEtud IN ( SELECT numEtud FROM NOTE MATHS PAR ETU WHERE NOTE MATHS
= ( SELECT MAX(NOTE MATHS) FROM NOTE MIN MATHS PAR ETU
) ); −− re qu ˆ e t e 8 et CREATE VIEW NOTE PAR ETU MOD AS numEtud, ud, codMo codMod d, SELECT numEt
( SELECT MAX( note ) RESULTAT R FROM RESULTAT numEtud ud = I .numEtu .numEtud d WHERE R. numEt codMod od = I . codM codMod od AND R. codM ) AS NOTE DEF
INSCRIPTI PTION ON I ; FROM INSCRI SELECT nomMod FROM MODULE M WHERE
( SELECT COUNT( ∗ ) PREREQUIS P FROM PREREQUIS M.codMod = P . codMod codMod WHERE M.codMod AND noteMin >
( SELECT NOTE DEF NOTE PAR ETU MOD MOD N FROM NOTE codMod od = P. codModPrereq codModPrereq WHERE N. codM numEtud ud = AND N. numEt
( SELECT numEtud FROM ETUDIANT WHERE nom = ’ F o u r i e r ’
) ) ) = 0 codMod NOT IN AND M. codMod ( SELECT codMod FROM INSCRIPTION WHERE numEtud IN
( SELECT numEtud FROM ETUDIANT WHERE nom = ’ F o u r i e r ’
) );
91
3.10 3.10
Intr Introdu oduct ctio ion n au au PL/S PL/SQL QL
−− E x er e r c i ce ce 1
DECLARE a NUMBER; b NUMBER; t NUMBER; BEGIN a := 1; b := 2; DBMS OUTPUT. PUT DBMS OUTPUT. PUT DBMS OUTPUT.PUT T.PUT t := a ; a := b; b := t ; DBMS OUTPUT. PUT DBMS OUTPUT. PUT
LINE( LINE( ’ a = ’ | | a ) ; LINE( LINE( ’ b = ’ | | b ) ; LI LINE( ’Let ’ ’ s swap swap a and and b . . . The The re su lt
LINE( LINE( ’ a = ’ | | a ) ; LINE( LINE( ’ b = ’ | | b ) ;
END;
/ e r c i ce ce 2 −− E x er
DECLARE a NUMBER; r e s NUMBER; c o u n t e r NUMBER; BEGIN a : = 1 0; 0; res := 1; counter := a ; WHILE co un te r > 0 LOOP LOOP r e s : = r e s ∗ counter ; c o u nt nt e r : = c o u nt nt e r − 1 ; LOOP; END LOOP; DBMS OUTPUT. PUT LINE( a | | ’!= ’ | | r e s ) ; END;
/ −− E x er e r c i ce ce 3
DECLARE a NUMBER : = 4 8 ; b NUMBER : = 8 4 ; amodb NUMBER; BEGIN DBMS DBMS OUTP OUTPUT. UT. PUT( ’PGCD( ’ | | a | | ’ , ’ | | b | | ’ ) = ’ ) ; WHILE WHILE b > 0 LOOP LOOP amod amodb b := a ; WHIL WHILE E amodb >= b LOOP amod amodb b := amod amodb b − b; END LOOP; a := b; b := amod amodb; b; LOOP; END LOOP; DBMS OUTPUT. PUT LINE ( a ) ; END;
/
92
is : ’ );
3.11 3.11
Tableau ableaux x et Struct Structure uress
SET SERVEROUTPUT ON
−− Tableaux
DECLARE TYPE montab IS VARRAY (5 0) OF INTEGER ; t mont montab; ab; BEGIN t : = m on on ta ta b ( ) ; t . e x t e nd nd ( 2 0 ) ; −− I n i t i a l i s a t i o n FOR i IN 1. .2 0 LOOP t ( i ) := i ∗ i ; LOOP; END LOOP; −− Inv ersi on de l ’ ordre des ´ e l´ el´ e ments ements DECLARE temp i n t e g e r ; BEGIN FOR i IN 1. . 10 LOOP t em em p : = t ( i ) ; t ( i ) : = t ( 20 20 − i +1); t(20 − i + 1 ) : = t em em p ; END LOOP; END; −− A f f i c h a g e FOR i IN 1. .2 0 LOOP DBMSOUT MSOUTPUT. PUT LINE( ’ t ( ’ | | i | | ’ ) = ’ | | t ( i )) ; LOOP; END LOOP; −− T ri ri a ` b u ll ll e DECLARE temp i n t e g e r ; BEGIN FOR i IN REVER VERSE 2 . . 2 0 LOOP FOR j IN 2 . . i LOOP I F t ( j − 1) > t ( j ) THEN t em em p : = t ( j ) ; t ( j ) : = t ( j − 1) ; t ( j − 1 ) : = t em em p ; END IF ; LOOP; END LOOP; END LOOP; END; −− A f f i c h a g e FOR i IN 1. .2 0 LOOP DBMSOUT MSOUTPUT. PUT LINE( ’ t ( ’ | | i | | ’ ) = ’ | | t ( i )) ; LOOP; END LOOP; −− Recherche par dichoto mie de l ’ ´ e l´ el´ e ment 225 ement DECLARE i n f INTEGER : = 1 ; su p INTEGER : = 2 0 ; m INTEGER ; X INTEGER : = 4 0 0 ; BEGIN LOOP DBMS OUTPUT. PUT PUT LINE( LINE( ’ i n f = ’ | | i n f | | ’ ; s u p = ’ | | sup ); m : = ( i n f + s up up ) / 2 ; EXIT WHEN t (m) (m) = X OR i n f = s up up ; IF t (m) (m) > X THEN s up up : = m− 1; ELSE
i n f : = m+ m+ 1; 1; END IF ; END LOOP;
IF t (m) = X THEN DBMS OUTPUT. PUT LINE (X | | ’ e s t d an an s l e t a bl b l e au au ’ ) ; ELSE
DBMS OUTPUT. PUT LINE (X | | ’ n ” e s t p as as d an an s l e t a bl bl e au au ’ ) ; END IF ; END; END;
/
93
−− S t r u c t u r e s
DECLARE −− M a i l l o n d ’ u ne ne l i s t e c h aˆ aˆı n e ´e TYPE TYPE CELL I S RECORD ( −− Don Donn´ n´ e e de chaque mai ll on ee data INTEGER, −− I n d i c e d u m a i l l o n p r e ´c e ´d e n t d e l a l i s t e , −− −1 s ’ i l n ’ y e n a p as as p r e v i o u s INTEGER, −− I n di d i c e d u m a i ll l l o n s u i va va n t d e l a l i s t e , −− −1 s ’ i l n ’ y e n a p as as n e x t INTEGER
); −− T y p e t a b l e a u c on on te t e na n a nt n t l e s m a il i l l on on s d e l a l i s t e TYPE TREE TREE I S VARRAY ( 1 9 ) OF CELL; CELL; −− T ab ab le le au au c on o n te t e na n a nt n t l e s m a il i l l on on s d e l a l i s t e t TRE TREE; −− i n d i c e d u p r em em i er er ´ e l e´m en en t d e l a l i s t e f i r s t i n te te ge ge r ; −− i n d i c e d u d e r n i e r ´ e l e´m en en t d e l a l i s t e l a s t i n t eg eg e r ; BEGIN t := TR TREE( ) ; t . e x t e nd nd ( 1 9 ) ; −− I n i t i a l i s a t i o n FOR i IN 1. .1 9 LOOP t ( i ) . d a ta ta : = p ow ow er er ( i , 5 ) mod 1 9 ; t ( i ) . p r e v i o u s : = i − 1; t ( i ) . next : = i + 1; 1; LOOP; END LOOP; f i r s t := 1 ; l a s t := 1 9 ; t ( f i r s t ) . p r e v i o us u s : = − 1; t ( l a s t ) . next := − 1; −− A f f i c h a g e DECLARE p i n t e g e r := f i r s t ; BEGIN WHILE WHILE p <> −1 LOOP LOOP DBMS OUTPUT. PUT LINE ( ’ ( ’ | | p | | t (p). data | | ’ , ’ | | t (p) . previous | | ’ , ’ | | t ( p ) . next | | ’ ) ’ ) ; p : = t ( p ) . next ; END LOOP; END;
’,
’
||
−− Inv ersi on de l ’ ordre des ´ e l´ el´ e ments ements DECLARE temp INTEGER ; BEGIN FOR i IN 1. . 19 LOOP t em em p : = t ( i ) . p r e v i o u s ; t ( i ) . p r e v i o u s : = t ( i ) . next ; t ( i ) . next : = t em em p ; END LOOP; first := 19; l a s t := 1 ; END; −− A f f i c h a g e DECLARE p i n t e g e r := f i r s t ; BEGIN WHILE WHILE p <> −1 LOOP LOOP DBMS OUTPUT. PUT LINE ( ’ ( ’ | | p || ’ , ’ || t (p). data | | ’ , ’ | | t (p) . previous | | ’ , ’ t ( p ) . next | | ’ ) ’ ) ; p : = t ( p ) . next ; END LOOP; END; −− T ri ri a ` b u ll ll e DECLARE i i n t e g e r := l a s t ; j i n t e g e r ; BEGIN WHILE t ( t ( i ). p rev iou s ). pre vio us j := f i r s t ; WHIL WHILE E i <> j LOOP LOOP
IF( t ( j ) . data
>
<>
||
−1 LOOP LOOP
t ( t ( j ) . next ) . d a t a ) THEN
94
−− E ch ch an an ge ge d e j e t t ( j ) . n e x t −− p a r m o d i f i c a t i o n d u c h aˆ aˆı n a g e DECLARE a f t e r J INTEGER : = t ( j ) . next ; b e f o r e J INTEGER : = t ( j ) . p r e v i o u s ; BEGIN t ( j ) . next : = t ( a f t e r J ) . next ; t ( a f t e r J ) . next : = j ; t ( afte rJ ). previous := beforeJ ; t ( j ). previous := afte rJ ; I F t ( j ) . next <> −1 THEN t ( t ( j ) . next ) . p r e v i o us us : = j ; ELSE last := j ; END IF ;
I F t ( a f t e r J ) . p r e v i o u s <> −1 THEN t ( t ( a f t e r J ) . p r e v i o u s ) . next : = a f t e r J ; ELSE first := afterJ ; END IF ;
I F a f t er e r J = i THEN i := j ; END IF ; END; ELSE
j : = t ( j ) . next ; END IF ;
LOOP; END LOOP; i := t ( i ). previous ; END LOOP; END;
−− A f f i c h a g e DECLARE p i n t e g e r := f i r s t ; BEGIN WHILE WHILE p <> −1 LOOP LOOP DBMS OUTPUT. PUT LINE ( ’ ( ’ | | p | | t (p). data | | ’ , ’ | | t (p) . previous | | ’ , ’ | | t ( p ) . next | | ’ ) ’ ) ; p : = t ( p ) . next ; END LOOP; END; END;
/
95
’,
’
||
3.12 3.12
Applic Applicati ation on du du PL/SQ PL/SQL L et Except Exception ionss
SET SERVEROUTPUT ON SET AUTOCOMMIT OFF
−− E x er e r c i ce ce 1
DECLARE u n C l i e n t PERSON PERSONNE%ROWTYPE; nu mC li en t PERSONNE. numper s%ty s%ty pe ; Y A EU UNE MERDE EXCEPTION; BEGIN FOR numCl ient IN 1. . 21 LOOP BEGIN SELECT ∗ INTO u n C l i e n t FROM PERSONNE numpers = numClient ; WHERE numpers INSERT INTO CLIENT ( numcli , VALUES
nomcli , preno mcli )
( unCli ent . numpers numpers , unCli ent .nom, .nom, unCli ent . preno prenom m ); EXCEPTION WHEN NO DATA FOUND THEN
DBMS DBMSOU OUTP TPUT. PUT LINE( LINE ( ’ P e rs rs on on n ne e n ”a ”a l ” i d e n t i f i a n t ’ | | numClient numClient ) ; TOO MANY MANY ROWS ROWS THEN WHEN TOO DBMS DBMSOU OUTP TPUT. PUT LINE( LINE ( ’ C e t te te m e ss ss a ge ge n e d e v r a i t j a m a i s a p p a r a ˆ ıtre ! ’ ); WHEN DUP VAL ON INDEX THEN DBMS DBMSOU OUTP TPUT. PUT LINE( LINE ( ’ C o n t r a i nt nt e d e c l ´e v i o l ´ e e ! M e ss ss ag ag e SQ SQL : ’ | | SQLE SQLERR RRM M) ; WHEN OTHERS THEN RAISE Y A EU UNE UNE MERDE; MERDE; END; LOOP; END LOOP; COMMIT; EXCEPTION WHEN Y A EU UNE MERDE THEN
DBMS OUTP OUTPUT. PUT LINE ( ’SQLC ’SQLCODE ODE = ’ | | SQLC SQLCOD ODE E) ; DBMS OUTPUT.PUT T.PUT LIN LINE( E( ’ I l y a eu une Merde Merde ! ’ ) ; ROLLBACK; END;
/ −− E x er e r c i ce ce 2
DECLARE un Cl ie nt CLIE CLIENT NT%rowtype ; BEGIN SELECT ∗ INTO u n C l i e n t numCli = FROM CLIENT WHERE numCli
( SELECT MAX( n u m c l i ) FROM CLIENT
); INSERT INTO PERSONNEL VALUES
( 1, unCli ent . nomcli , unClient . prenomcli , NULL, 1254.28 ); COMMIT; EXCEPTION WHEN NO DATA FOUND THEN
DBMS OUTPUT. PUT PUT LINE( LINE( ’ Aucun Aucun c l i e n t ’ ) ; WHEN DUP VAL ON INDEX THEN
DBMS OUTP OUTPUT. PUT LINE( LINE ( ’ I l y a un g r o s p r ob ob l` l` e m e . . . J ” c om om pr pr en en d dss p a s c ” q u i s ” p a s s e ’ ) ; END;
/ −− E x er e r c i ce ce 3
DECLARE num Cli ent CLIE CLIENT. NT. num cl i%TYPE; tCCL TYPE YPECCL. n um ty pe cc l%TYPE; n t o TYPEOP PEOPER ERAT ATIO ION. N. nu mt yp eo pe r%TYPE; TYPE; Y A UN GRO BLEME EXCEPTION; BEGIN SELECT numtypeoper INTO nt o
96
FROM TYPEOPERATION epˆ e pˆot o t es p` ec e c es ’ ; WHERE nomtypeoper = ’ d´ SELECT numtypeccl INTO tCCL FROM TYPECCL nomtyp ypeC eCCL CL = ’Compt ’Compte e cour ant ’ ; WHERE nomt FOR numCl ient IN 1. . 21 LOOP
BEGIN INSERT INTO COMPTECLIENT VALUES
( numClient , 1, tCCL tCCL , SYSDATE, 1 ); INSERT INTO OPERATION VALUES ( numClient , 1, 1, nto , SYSDATE, numClient ∗ 100 , ’ i n a u g u r a t i o n d u c o mp mp te te ’ ); COMMIT; EXCEPTION WHEN OTHERS THEN
−− Adaptez le num num´ ´ e ro du code , ero oi ¸ c a don ca donne ne −2290 −− c h e z m oi IF SQLCOD LCODE = − 2290 THEN DECLARE t o t a l OPERATION. mon tan top er%TYPE := num Cli ent ∗ 1 0 0 ; t o I n s e r t OPERATION. mo nta nto per%TYPE; cp t NUMBER : = 1 ; BEGIN WHILE t ot a l > 0 LOOP LOOP I F t o t a l > 1000 THEN t o I n s e r t : = 1 0 00 00 ; ELSE
t o I n s e r t := t o t a l ; END IF ; INSERT INTO OPERATION VALUES
( numClient , 1, (SELECT nvl (MAX( n u mo mo pe pe r ) , 0 ) + 1 FROM OPERATION mC C l i en en t WHERE n u m c l i = n u m AND n u m c c l = 1 ), nto , SYSDATE, toInsert , ’ I n a u g u r a t i o n du c om om pt pt e ’ | | cp t ); t o t a l : = t o t al al − t o I n s e r t ; c pt p t : = c pt pt + 1 ; END LOOP; EXCEPTION WHEN OTHERS THEN
DBMS OUTPUT. PUT PUT LINE( LINE( ’M ’MOD( t ot al , 10 00 ) = ’ | | MOD( tot al , DBMS DBMSOU OUTP TPUT. PUT LINE ( ’SQLC ’SQLCODE ODE = ’ | | SQLC SQLCOD ODE E) ; DBMS OUTPUT. PUT LINE ( ’SQLE ’SQLERRM = ’ | | SQLE SQLERR RRM M) ; RAISE Y A UN GRO GRO BLEME; BLEME; END; ELSE
DBMS OUTPUT. PUT LINE ( ’SQLC ’SQLCOD ODE = ’ | | SQLC SQLCOD ODE E) ; DBMS OUTPUT. PUT LINE ( ’SQLE ’SQLERRM = ’ | | SQLERR LERRM M) ; ROLLBACK; END IF ; END; LOOP; END LOOP; EXCEPTION WHEN NO DATA FOUND THEN
DBMS OUTPUT. PUT PUT LIN LINE( E( ’ Pas de don n´ ee ee s ! ’ ) ; TOO MANY MANY ROWS ROWS THEN WHEN TOO DBMS OUTPUT. PUT PUT LIN LINE( E( ’ Trop de do nn´ee ee s ! ’ ) ; WHEN Y A UN GRO BLEME THEN
DBMS OUTPUT. PUT PUT DBMS OUTP OUTPUT. PUT DBMS OUTP OUTPUT. PUT WHEN OTHERS THEN DBMS OUTP OUTPUT. PUT DBMS OUTP OUTPUT. PUT
LINE( LINE( ’ I l y a un gr os prob l` eme e me ! ’ ) ; LINE ( ’SQLC ’SQLCODE ODE = ’ | | SQLC SQLCOD ODE E) ; LINE ( ’SQL ’SQLERRM = ’ | | SQLE SQLERR RRM M) ; LINE ( ’SQLC ’SQLCODE ODE = ’ LINE ( ’SQL ’SQLERRM = ’
| | SQLC SQLCOD ODE E) ; | | SQLE SQLERR RRM M) ;
END;
/ −− E x er e r c i ce ce 4
97
100 0) );
DECLARE numCl ient CLIENT. IENT. num cli%T cli%TYPE := 2; nu mC om pt eL iv re t TYPECCL. numtypeCCL% numtypeCCL%TYPE; YPE; n t o TYPEOP PEOPER ERAT ATIO ION. N. nu mt yp eo pe r%TYPE; TYPE; mo nt an t OPERA PERAT TION. ION. mon ta nt op er%T er%TYPE; Y A UN GRO BLEME EXCEPTION; BEGIN SELECT numtypeoper INTO nt o FROM TYPEOPERATION nomtypeoper = ’ vireme nt ’ ; WHERE nomtypeoper SELECT numtypeccl INTO numCompteLivret FROM TYPECCL om ty ty pe pe Cc Cc l = ’ l i v r e t ’ ; WHERE n om
( numClient , 2, numCompteLivret , SYSDATE, 1 ); INSERT INTO OPERATION VALUES ( numClient , 1, (SELECT nvl (MAX( n u mo mo pe pe r ) , 0 ) + 1 FROM OPERATION mC C l i en en t WHERE n u m c l i = n u m mc ccl = 1) , AND n u m nto , SYSDATE, −montant , ’ v e rs r s em e m en en t l i v r e t ’ ); INSERT INTO OPERATION VALUES ( numClient , 2, (SELECT nvl (MAX( n u mo mo pe pe r ) , 0 ) + 1 FROM OPERATION mC C l i en en t WHERE n u m c l i = n u m mc ccl = 2) , AND n u m nto , SYSDATE, montant , ’ v e rs r s em e m en en t l i v r e t ’ ); COMMIT; EXCEPTION WHEN OTHERS THEN
−− idem IF SQLCOD LCODE = − 2290 THEN DECLARE t o t a l OPERATION. mont ant ope r%TYPE := montant ; toM ove OPER OPERAT ATION. ION. mo nt an to pe r%TYPE; c pt NUMBER : = 1 ; BEGIN WHILE t o ta l > 10 00 LOOP I F t o t a l > 1000 THEN t oM oM ov ov e : = 1 0 0 0 ; ELSE
t om om ov ov e : = t o t a l ; END IF ; INSERT INTO OPERATION VALUES
( numClient , 1, (SELECT nvl (MAX( n u mo mo pe pe r ) , 0 ) + 1 FROM OPERATION mC C l i en en t WHERE n u m c l i = n u m mc ccl = 1) , AND n u m nto , SYSDATE, −toMove , ’ v er e r se se me me nt nt l i v r e t ’ | | c p t ); INSERT INTO OPERATION VALUES ( numClient , 2, (SELECT nvl (MAX( n u mo mo pe pe r ) , 0 ) + 1 FROM OPERATION mC C l i en en t WHERE n u m c l i = n u m mc ccl = 2) , AND n u m nto ,
98
SYSDATE, toMove , ’ v er e r se se me me nt nt l i v r e t ); t o t a l : = t o t a l − toMove ; c pt p t : = c pt pt + 1 ; LOOP; END LOOP; COMMIT;
’ ||
EXCEPTION WHEN OTHERS THEN
RAISE Y A UN GRO GRO BLEM BLEME E; END; ELSE
DBMS OUTPUT. PUT LINE ( ’SQLC ’SQLCOD ODE = ’ | | SQLC SQLCOD ODE E) ; DBMS OUTPUT. PUT LINE ( ’SQLE ’SQLERRM = ’ | | SQLE SQLERR RRM M) ; ROLLBACK; END IF ; END; COMMIT;
n u m Cl Cl i e n t : = n u m mC C l i en en t + 2 ; LOOP; END LOOP; EXCEPTION WHEN NO DATA FOUND THEN DBMS OUTPUT. PUT PUT LIN LINE( E( ’ Pas de don n´ ee ee s ! ’ ) ; TOO MANY MANY ROWS ROWS THEN WHEN TOO DBMS OUTPUT. PUT PUT LIN LINE( E( ’ Trop de do nn´ee ee s ! ’ ) ; WHEN Y A UN GRO BLEME THEN
DBMS OUTPUT. PUT PUT DBMS OUTP OUTPUT. PUT DBMS OUTP OUTPUT. PUT WHEN OTHERS THEN DBMS OUTP OUTPUT. PUT DBMS OUTP OUTPUT. PUT
LINE( LINE( ’ I l y a un gr os prob l` eme e me ! ’ ) ; LINE ( ’SQLC ’SQLCODE ODE = ’ | | SQLC SQLCOD ODE E) ; LINE ( ’SQL ’SQLERRM = ’ | | SQLE SQLERR RRM M) ; LINE ( ’SQLC ’SQLCODE ODE = ’ LINE ( ’SQL ’SQLERRM = ’
| | SQLC SQLCOD ODE E) ; SQLERR RRM M) ; | | SQLE
END;
/
99
cpt
3.13 3.13
Sous Sous-p -pro rogr gram amme mess
−− E x er e r c i ce ce 1
REPLACE FUNCTION FUNCTION CREATE OR REPLACE b a d p ui ui s s a n ce c e ( b NUMBER, n NUMBER) RETURN NUMBER IS BEGIN I F ( n = 0 ) THEN RETURN 1 ; ELSE
RETURN URN b ∗ b a d pu pu i s sa s a n ce ce ( b , n − 1 ) ; END IF ; END;
/ −− E x er e r c i ce ce 2
REPLACE FUNCTION FUNCTION CREATE OR REPLACE g o o d pu p u i s s a nc n c e ( b NUMBER, n NUMBER) RETURN NUMBER IS BEGIN I F ( n = 0 ) THEN RETURN 1 ; END IF ; I F ( MO MOD( n , 2 ) = 0 ) THEN RETURN good pui ssa nce (b ∗ b , n / 2 ); ); END IF ; RETU RETURN RN b ∗ g o od od p u is i s s an an c e ( b , n − 1 ) ; END;
/ −− E x er e r c i ce ce 3
REPLACE FUNCTION FUNCTION CREATE OR REPLACE de mi Fr er es (A PERSONNE. numpers%typ numpers%typ e , B PERSONNE. numpers%ty numpers%ty pe ) RETURN BOOL BOOLEAN EAN I S rowA PERS PERSON ONNE NE%ro wt y pe ; rowB PERS PERSON ONNE NE%ro wt y pe ; BEGIN numperss = A; SELECT ∗ INTO rowA FROM PERSONNE WHERE numper numperss = B; SELECT ∗ INTO rowB FROM PERSONNE WHERE numper RETURN rowA. rowA. pe re = rowB rowB . per e OR rowA. rowA. mere = rowB rowB . mere ; END;
/ −− E x er e r c i ce ce 4
REPLACE FUNCTION FUNCTION CREATE OR REPLACE f r e r e s (A PER PERSONNE. numper s%type , B PERSONNE. numper s%ty s%ty pe ) RETURN URN BOOLEAN BOOLEAN I S rowA PERS PERSON ONNE NE%ro wt y pe ; rowB PERS PERSON ONNE NE%ro wt y pe ; BEGIN numperss = A; SELECT ∗ INTO rowA FROM PERSONNE WHERE numper numperss = B; SELECT ∗ INTO rowB FROM PERSONNE WHERE numper RETURN rowA. rowA. pe re = rowB rowB . per e AND rowA. rowA. mere = rowB rowB . mere ; END;
/ REPLACE FUNCTION FUNCTION CREATE OR REPLACE co us in sG er ma in s (A PER PERSONNE. numper s%typ s%typ e , B PER PERSONNE. numpe rs%ty rs%ty pe ) RETURN URN BOOLEAN BOOLEAN I S rowA PERS PERSON ONNE NE%ro wt y pe ; rowB PERS PERSON ONNE NE%ro wt y pe ; BEGIN numperss = A; SELECT ∗ INTO rowA FROM PERSONNE WHERE numper numperss = B; SELECT ∗ INTO rowB FROM PERSONNE WHERE numper RETURN fr er es (rowA. (rowA. pere , rowB. rowB. pere ) OR
fr er es (rowA. (rowA. pere , rowB. rowB. mere) OR
fr er es (rowA. (rowA. mere mere , rowB. rowB. pere ) OR
fr er es (rowA. (rowA. mere mere , rowB. rowB. mere ); END;
/ −− E x er e r c i ce ce 5 CREATE OR REPLACE PROCEDURE
ai e ul (P PE PERSONNE. numpers%type numpers%type ) IS row ro w PERS PERSON ONNE NE%ro wt y pe ; nb NUMBER; BEGIN SELECT co un t ( ∗ ) INTO NB FROM PERSONNE
100
WHERE numpers = P; I F ( NB NB = 1 ) THEN SELECT ∗ INTO row FROM PERSONNE WHERE numpers = P; DBMS OUTPUT. PUT LINE( LINE( row . nom nom ) ; a i e u l ( r ow ow . p e r e ) ; END IF ; END;
/ −− E x er e r c i ce ce 6 CREATE OR REPLACE PROCEDURE
mecs (P PER PERSONNE. numper s%ty s%ty pe ) IS row ro w PERS PERSON ONNE NE%ro wt y pe ; nb NUMBER; BEGIN SELECT co un t ( ∗ ) INTO NB FROM PERSONNE WHERE numpers = P; I F ( NB NB = 1 ) THEN SELECT ∗ INTO row FROM PERSONNE WHERE numpers = P; SELECT co un t ( ∗ ) INTO NB FROM PERSONNE WHERE p e r e = P ; IF (NB (NB > 0) THEN
DBMS OUTPUT. PUT LINE( LINE( row . nom nom ) ; END IF ;
mecs( mecs( row row . pere ) ; mecs( row . mere ); END IF ; END;
/ −− E x er e r c i ce ce 7
REPLACE FUNCTION FUNCTION CREATE OR REPLACE as ce nd an t (A PERSONNE. numpers%typ numpers%typ e , B PERSONNE. numpers%ty numpers%ty pe ) RETURN URN BOOLEAN BOOLEAN I S row ro w PERS PERSON ONNE NE%ro wt y pe ; BEGIN numperss = B; SELECT ∗ INTO row FROM PERSONNE WHERE numper I F ( r o w . p e r e = A OR row . mere = A) THEN RETURN TRUE; END IF ; RETURN ( row . pe re IS NOT NULL AND ascend ant (A, row row . pere )) OR (row . mere IS NOT NULL AND a s c e n d a n t ( A, A, r ow ow . m er er e ) )
;
END;
/ BEGIN I F ( a s c e n da da n t ( 1 , 8 ) ) THEN DBMSOUT MSOUTPUT. PUT LINE ( ’OK’ ) ; ELSE
DBMS OUTPUT. PUT LINE( LINE( ’ pa s OK’ ) ; END IF ; END;
/ −− E x er e r c i ce ce 8
REPLACE FUNCTION FUNCTION CREATE OR REPLACE fmax fmax (A NUMBER, B NUMBER) RETURN NUMBER IS BEGIN IF (A
>
B) THEN RETU RETURN A ;
ELSE
RETU RETURN B ; END IF ; END;
/ REPLACE FUNCTION FUNCTION CREATE OR REPLACE ec ar tA sc en da nt (A PER PERSONNE. numper s%typ s%typ e , B PER PERSONNE. numpe rs%ty rs%ty pe ) RETURN NUMBER IS row ro w PERS PERSON ONNE NE%ro wt y pe ; NB NUMBER; BEGIN numperss = B; SELECT ∗ INTO row FROM PERSONNE WHERE numper I F ( r o w . p e r e = A OR row . mere = A) THEN RETURN 1 ; END IF ;
I F ( r ow ow . p e r e I S NULL) THEN
101
NB := − 1; ELSE
NB : = e c a r t A s c e n d a n t ( A, A, r ow ow . p e r e ) ; END IF ;
I F ( r o w . m er er e I S NULL) THEN NB := fmax( fmax( − 1 , NB ) ; ELSE
NB := fmax( fmax( ecartA scen dant (A, row . pere ) , NB); END IF ;
IF (NB (NB
− 1) THEN NB := NB + 1;
<>
END IF ;
RETURN NB; END;
/ REPLACE FUNCTION FUNCTION CREATE OR REPLACE e c ar t (A PERSONNE. numpers%typ numpers%typ e , B PERSONNE. numpers%ty numpers%ty pe ) RETURN NUMBER IS row ro w PERS PERSON ONNE NE%ro wt y pe ; NB NUMBER; BEGIN RETURN fmax( fmax( ecart Ascen dant (A, B) , ecartA scend ant (B, A) ); END;
/ −− E x er e r c i ce ce 9
A.nom, A. pren prenom om , B.nom, B.nom, B. preno prenom m SELECT A.nom, PERSON ONNE NE A , PERS PERSON ONNE NE B FROM PERS (A. numper numperss , B. numpers) numpers) = WHERE ecart Ascen dant (A. ( SELECT MAX( ec ) FROM
( numpers , B. numpers numpers ) AS e c SELECT ec ar t (A. numpers PERSON ONNE NE A , PERS PERSON ONNE NE B FROM PERS ) ); −− E x e r c i c e 1 0
102
3.14 3.14
Curs Curse eurs urs
CREATE OR REPLACE PROCEDURE co pyF rom Per son neT oCl ie nt IS
CURSOR C I S SELECT ∗ PERSONNE; FROM PERSONNE;
ROW C%ro wt yp e ; BEGIN FOR ROW IN C LOOP LOOP INSERT INTO CLIENT
( n u m cl cl i , n o mc mc l i , p r e n o m cl cl i ) VALUES
(ROW. num pe rs , ROW. nom, ROW. pre nom ) ; LOOP; END LOOP; COMMIT; EXCEPTION WHEN DUP VAL ON INDEX THEN DBMS OUTPUT. PUT PUT LINE( LINE( ’Copy can be done on ly once . ’ ) ; END;
/ CALL copyFromPe rsonneToCl ient ( ) ; CREATE OR REPLACE PROCEDURE ta ke Cl ie nt To Pe rs on ne l IS
Row cl ie nt%rowtype nt%rowtype ; BEGIN Row SELECT ∗ INTO Row FROM CLIENT mc l i = WHERE n u mc ( SELECT MAX( n u m c l i ) CLIENT) NT) ; FROM CLIE INSERT INTO PERSONNEL
(Ro (Row. numcli , Row. nomcli , Row. preno mcl i ) ; COMMIT; EXCEPTION WHEN DUP VAL ON INDEX THEN
DBMS OUTPUT.PUT T.PUT LINE( LINE( ’ This row has al re ady been impor ted . ’ ) ; ROLLBACK; WHEN NO DATA FOUND THEN
DBMS OUTPUT. PUT PUT LIN LINE( E( ’ Tab le CLIE CLIENT NT i s empty . ’ ) ; ROLLBACK; END;
/ CALL t a k e C l i e n t T o P e r s o n n e l ( ) ; CREATE OR REPLACE PROCEDURE
cre di tAc cou nt ( numc lie nt CLIENT. numcli%type numcli%type , v a l u e NUMBER) I S BEGIN IF ( value > 100) THEN c r e d i t A c c o u n t ( n u m c l i e nt nt , 1 0 0 ) ; c r e d i t A c c o u n t ( n u m c l i e n t , value − 1 0 0 ) ; ELSE INSERT INTO OPERATION VALUES
( numclient , 1, (SELECT nvl (MAX( n u mo mo pe pe r ) , 0 ) + 1 FROM OPERATION WHERE n u m c l i = n u m c l i e n t AND n u m c c l = 1 ), (SELECT numtypeoper FROM TYPEOPERATION nomtypeoper = ’ viremen t ’ WHERE nomtypeoper ), sysdate , value , ’ c a d e au au ! ’ ); END IF ; EXCEPTION WHEN OTHERS THEN
IF (SQ (SQLC LCOD ODE E = − 22900) THEN DBMS OUTPUT. PUT PUT LIN LINE( E( ’Too much much money at onc e . ’ ) ; END IF ; END;
/ CREATE OR REPLACE PROCEDURE
cre ate Vir eme nt ( num cli ent CLIENT. numcli%type numcli%type , v a l u e NUMBER) I S BEGIN INSERT INTO OPERATION VALUES
(numclient , 1, (SELECT nvl (MAX( n u mo mo pe pe r ) , 0 ) + 1
103
FROM OPERATION WHERE n u m c l i = n u m c l i e n t AND n u m c c l = 1
), (SELECT numtypeoper FROM TYPEOPERATION nomtypeoper = ’ vireme nt ’ WHERE nomtypeoper ), sysdate , −value , ’ c a de de au au ! ’ ); INSERT INTO OPERATION VALUES (numclient , 2, (SELECT nvl (MAX( n u mo mo pe pe r ) , 0 ) + 1 FROM OPERATION WHERE n u m c l i = n u m c l i e n t AND n u m c c l = 1 ), (SELECT numtypeoper FROM TYPEOPERATION nomtypeoper = ’ vireme nt ’ WHERE nomtypeoper ), sysdate , value , ’ c a de de au au ! ’ ); EXCEPTION WHEN OTHERS THEN
IF (SQ (SQLC LCOD ODE E = − 22900) THEN DBMS OUTPUT. PUT PUT LIN LINE( E( ’Too much much money at onc e . ’ ) ; END IF ; END;
/ CREATE OR REPLACE PROCEDURE
moveToLivret ( numc lie nt CLIENT. numcli%type numcli%type , v a l u e NUMBER) I S BEGIN IF ( value >= 0) THEN IF ( value > 100) THEN m o ve ve T oL oL i v re re t ( n u m c l i e n t , 1 0 0 ) ; moveToLivret(numclient , value − 1 0 0 ) ; ELSE
c r e a t e V i r e m e n t ( n u m c l i e n t , value ) ; END IF ; END IF ; EXCEPTION WHEN OTHERS THEN
IF (SQ (SQLC LCOD ODE E = − 22900) THEN DBMS OUTPUT. PUT PUT LIN LINE( E( ’Too much much money at onc e . ’ ) ; END IF ; END;
/ CREATE OR REPLACE PROCEDURE
openAccount( openAccount( numcli ent CLIENT. numcli% numcli%type ) IS BEGIN INSERT INTO COMPTECLIENT VALUES
(numclient , 1, (SELECT numtypeccl FROM TYPECCL pe c c l = ’ C om om p ptt e c o u r a n t ’ WHERE n o m t y pe ), sysdate , (SELECT numpers FROM PERSONNEL WHERE numpers = ( SELECT MAX( n u m c l i ) FROM CLIENT ) ) ); INSERT INTO COMPTECLIENT VALUES (numclient , 2, (SELECT numtypeccl FROM TYPECCL pe c c l = ’ v i r e m e n t ’ WHERE n o m t y pe ), sysdate , (SELECT numpers FROM PERSONNEL WHERE numpers = ( SELECT MAX( n u m c l i ) FROM CLIENT
104
) ) ); c r e d i t A c c o u n t ( n u m c l i en en t , n u m c l ie ie n t ∗ 1 0 0 ) ; m o ve ve T oL oL i v re re t ( n u m c l i e n t , n u m c l i e n t ∗ 10 0 − 5 0 0 ) ; EXCEPTION WHEN DUP VAL ON INDEX THEN
DBMS OUTPUT.PUT T.PUT LINE( LINE( ’ This acco unt has al re ad y been opened . ’ ) ; END;
/ REPLA ACE PROCEDURE op en Ac co un ts CREATE OR REPL
IS
CURSOR C I S CLIENT ; SELECT numcli FROM CLIENT ROW C%ro wt yp e ; BEGIN FOR ROW IN C LOOP LOOP openAc count (ROW. numc li ) ; LOOP; END LOOP; COMMIT; EXCEPTION WHEN OTHERS THEN
DBMS OUTPUT.PUT T.PUT LIN LINE( E( ’An ’An er ro r has occ urr ed . ’ ) ; ROLLBACK; END;
affic heDes cendan ce ( num mp p e rs rs o nn nn e NUMBER) IS CURSOR C I S SELECT ∗ FROM PERSONNE numpersonne WHERE pere = numpersonne OR mere = numpersonne ; ROW C%rowT C%rowT ype yp e ; BEGIN FOR ROW IN C LOOP LOOP DBMSOUT MSOUTPUT. PUT LINE ( row . nom | | ’ ’ | | row . prenom ) ; af fi ch eD es ce nd an ce (R (ROW. numpers numpers ); LOOP; END LOOP; END;
/
105
3.15 3.15
Curs Curseur eurss param´ par am´ etr´ etr´ es es
−− E x er e r c i ce ce 1
PROCEDURE a f f i c h e Cl i e n t ( un Cl ie nt CLIEN IENT%rowtype ) IS CREATE OR REPLACE PR BEGIN DBMS OUTPUT. PUT PUT LINE( LINE( ’ Cl i e nt
’
||
unClient . prenomcli
||
’
’
||
unCli ent . nomCli nomCli );
END;
/ REPLA ACE PROCEDURE af f i c he Co m p t e ( unComp te COMPTECLIENT%ro wt yp e ) IS CREATE OR REPL BEGIN DBMS OUTPUT. PUT LINE ( ’ ∗ Comp Compte te ’
| | unCompte unCompte . numCli
||
’− ’
| | unComp unCompte te . numccl ) ;
END;
/ PROCEDURE af fi ch eC om pt es Cl ie nt s IS CREATE OR REPLACE PR CURSOR cl ie nt s IS SELECT ∗ CLIENT ; FROM CLIENT unClient cl ie nt s% %rr o wt wt y pe pe ; CURSOR comptes ( num cli ent CLIENT. numcl i%type i%type ) IS SELECT ∗ FROM COMPTECLIENT WHERE n u m c l i = n u m c l i e n t ; un unCo Comp mpte te cl ie nt s%rowtype s%rowtype ; BEGIN FOR unCli ent IN c l i e n t s LOOP a f f i c h e C l i e n t ( u n Cl Cl i e nt nt ) ; FOR unCompte IN comptes ( unC lie nt . numcl i ) LOOP affic heCompt e (unCom (unCompt pte e ); END LOOP; LOOP; END LOOP; END;
/ SET SERVEROUTPUT ON SIZE 1000000
c a l l a f f i c h e C om o m p t e s C l i e nt nt s ( ) ; −− E x er e r c i ce ce 2
PROCEDURE af f i c h e O pe r at i o n ( un eO pe ra ti on OPERATION%rowty pe ) IS CREATE OR REPLACE PR BEGIN DBMS OUTPUT. PUT LINE ( ’ ∗ ∗ O p e ra ra t i on on ’
||
uneOp erat ion . numO numOpe perr | |
’ , m on on ta ta nt nt :
’
||
uneOp erati on . montantOper montantOper )
END;
/ PROCEDURE af fi ch eO pe rC om pt es Cl ie nt s IS CREATE OR REPLACE PR CURSOR cl ie nt s IS SELECT ∗ CLIENT ; FROM CLIENT unClient cl ie nt s% %rr o wt wt y pe pe ; CURSOR comptes ( num cli ent CLIENT. numcl i%type i%type ) IS SELECT ∗ FROM COMPTECLIENT WHERE n u m c l i = n u m c l i e n t ; un unCo Comp mpte te cl ie nt s%rowtype s%rowtype ; CURSOR o pe ra ti on s ( numcli ent CLIENT. numcl i%type i%type , numcompte COMPTECLIENT. numc cl%ty pe ) IS SELECT ∗ FROM OPERATION mc l i = n u m c l ie ie n t WHERE n u mc numcompt mpte e; AND numccl = numco u n e O p e r at at i o n o p e r a t i o n s %r %r o wt wt y p e ; BEGIN FOR unCli ent IN c l i e n t s LOOP a f f i c h e C l i e n t ( u n Cl Cl i e nt nt ) ; FOR unCompte IN comptes ( unC lie nt . numcl i ) LOOP affic heCompt e (unCom (unCompt pte e ); FOR uneOp erati on IN ope rat ion s ( unCli ent . numcli , un unCo Comp mpte. te. numccl) numccl) LOOP a f f i c h e O p e r a t i o n ( u n e O pe pe r a ti ti o n ) ; LOOP; END LOOP; END LOOP; LOOP; END LOOP; END;
/ c a l l a f f i ch c h e O pe p e r C om o m p t e sC s C l i e nt nt s ( ) ;
106
3.16 3.16
Trigg rigger erss
−− I l c o n vi v i e n t d ’ a bo b o rd r d d e m o d if i f i e r q u e l qu q u e p eu eu l ’ o r g a n i s at at i o n d e s −− d o nn nn e es es , o n a j o u t e p a r e x e mp mp l e d a ns ns l a t a b l e MO MODULE l e n om om br br e −− d ’ e t u d ia ia n t s i n s c r i t s DROP TABLE DROP TABLE DROP TABLE DROP TABLE DROP TABLE DROP TABLE
CREATE TABLE ETUDIANT (numEtud number , nom varchar2 ( 4 0 ) , prenom varchar2 ( 4 0 ) , d a t e n a i s s date , c i v i l i t e varchar2 ( 4 ) , patronyme varchar2 ( 4 0 ) , numsecu varchar2 ( 1 5 ) NOT NULL, moyenne NUMBER DEFAULT NULL ) ; CREATE TABLE MODULE (codMod number , nomMod varchar2 ( 1 5 ) , e f f e c M a x nu numb mber er DEFAULT 30 , e f f e c nu numb mbe er def aul t 0 ) ; CREATE TABLE EXAMEN (codMod number , codExam number , dateExam date ) ; CREATE TABLE INSCRIPTION (numEtud number , codMod number , d a t e I n s c d at at e d e f a u l t s y s d a t e ) ; CREATE TABLE PREREQUIS (codMod number , codModPrereq number , noteMin number ( 4 , 2 ) NOT NULL) ; CREATE TABLE RESULTAT (codMod number , codExam number , numEtud number , n o t e number ( 4 , 2 ) ) ; ALTER TABLE ETUDIANT ADD an t CONSTRAINT p k e t u d i an (numEtud) ; PRIMARY KEY (numEtud) ALTER TABLE MODULE ADD CONSTRAINT pk module (codMod d); PRIMARY KEY (codMo ALTER TABLE EXAMEN ADD CONSTRAINT pk examen (codMod d , codE codExa xam m); PRIMARY KEY (codMo ALTER TABLE PREREQUIS ADD CONSTRAINT p k p r e r e q u i s (codMod d , codModPrereq codModPrereq ) ; PRIMARY KEY (codMo ALTER TABLE INSCRIPTION ADD CONSTRAINT p k i n s c r i p t i o n (codMod d , numE numEtu tud d); PRIMARY KEY (codMo ALTER TABLE RESULTAT ADD CONSTRAINT p k r e s u l t a t (codMod d , numE numEtu tud d , codE codExa xam m); PRIMARY KEY (codMo ALTER TABLE INSCRIPTION ADD (CONSTRAINT f k i n s c r i p t i o n e t u d i a n t FOREIGN KEY (numEtud)
REFE REFERE RENC NCES ES ETUD ETUDIAN IANT( T( numEtu num Etud d) , CONSTRAINT f k i n s c r i p t i o n m o d u l e FOREIGN KEY (codMod)
REFE REFERE RENC NCES ES MODULE( cod Mod ) ) ; ALTER TABLE PREREQUIS ADD (CONSTRAINT f k p r e r e qu q u i s c o d m od od FOREIGN KEY (codMod)
REFERE REFERENCE NCES S MODULE( codM co dMod od ) , u i s c o d m o dp dp r e r e q CONSTRAINT f k p r e r e q ui FOREIGN KEY (codModPrereq) REFE REFERE RENC NCES ES MODULE( cod Mod ) ) ; ALTER TABLE EXAMEN ADD CONSTRAINT f k e x a m e n FOREIGN KEY (codMod)
REFE REFERE RENC NCES ES MODULE( cod Mod ) ; ALTER TABLE RESULTAT ADD
107
(CONSTRAINT f k r e s u l ta t a t e x a m en en (codMod, codExa codExam) m) FOREIGN KEY (codMod, REFE REFERE RENC NCES ES EX EXAMEN( codMod codMo d , codExam cod Exam ) , CONSTRAINT f k r e s u l t a t i n s c r i p t i o n (codMod, numEt numEtud) ud) FOREIGN KEY (codMod,
REFERENCES INSCRI INSCRIPTI PTION( ON( codMod , numEtud) ) ; ALTER TABLE ETUDIANT ADD (CONSTRAINT c k c i v i l i t e CHECK
( c i v i l i t e IN ( ’M ’Mr ’ , ’ Mme ’ , ’ M l l e ’ ) ), CONSTRAINT c k c i v i l i t e n u m s e c u CHECK
( um se se cu cu , SUBSTR( n um
1 , 1 ) = ’ 2 ’ OR patronyme patronyme IS NULL
), CONSTRAINT c k l e n g t h n u m s e c u CHECK
( l e n g t h ( n u ms ms ec ec u ) = 1 5 ), CONSTRAINT c k a n n e e n u m s e c u CHECK ( t o c h a r ( d a t e n a i s s , ’ y y ’ ) = substr ( n u ms ms ec ec u , 2 , 2 ) ) ); −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −− C o n t r ai ai n t e 1 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− CREATE OR REPLACE TRIGGER beforeUpdateFERPrerequis BEFORE UPDATE ON PREREQUIS
FOR EACH ROW BEGIN IF (:new. noteMin < : old . noteMin) THEN : new. new. noteMin noteMin := : old . noteMin noteMin ; END IF ; END; / −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −− C o n t r ai ai n t e 2 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
PROCEDURE i n c r E f f e c CREATE OR REPLACE PR
( modul e NUMBER) IS
BEGIN e c = e f f e c + 1 WHERE codmod codmod = module ; UPDATE MODULE SET e f f ec END;
/ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− CREATE OR REPLACE PROCEDURE d e c r E f f e c
( mod ule NUMBER) IS
BEGIN codmod = module ; UPDATE MODULE SET e f f e c = e f f e c − 1 WHERE codmod END;
/ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− CREATE OR REPLACE TRIGGER BeforeInsertFERModule BEFORE INSERT ON MODULE
FOR EACH ROW BEGIN : ne n ew . e f f e c : = 0 ; END; / −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− CREATE OR REPLACE TRIGGER a f t e r I n s e r t F E R I n s c AFTER INSERT ON INSCRIPTION
FOR EACH ROW BEGIN i n c r E f f e c ( : ne w . c o dm dm od od ) ; END; / −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
108
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− CREATE OR REPLACE TRIGGER a f t e r D e l e t e F E R I n s c AFTER DELETE ON INSCRIPTION
FOR EACH ROW BEGIN d e c r E f f e c ( : o l d . c od od mo mo d ) ; END; / −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− CREATE OR REPLACE TRIGGER afterUpdateFERInsc AFTER UPDATE ON INSCRIPTION
FOR EACH ROW BEGIN d e c r E f f e c ( : o l d . c od od mo mo d ) ; i n c r E f f e c ( : ne w . c o dm dm od od ) ; END; / −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− DROP VIEW m o d u l e s D i s p o n i b l e s ; CREATE VIEW m o d u l e s D i s p o n i b l e s AS SELECT codmod FROM MODULE WHERE e f f e c < effecMax ;
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− CREATE OR REPLACE TRIGGER b e f o r e I n s e r t U p d a t e F E R I n s c BEFORE INSERT OR UPDATE ON INSCRIPTION
FOR EACH ROW DECLARE nbLignes NUMBER; BEGIN SELECT co un t ( ∗ ) INTO nbLignes FROM m o d u l e s D i s p o n i b l e s codmod od = : new. new. codm codmod; od; WHERE codm I F ( n b L ig i g ne n e s = 0 ) THEN RAISE APPLICATION ERROR( − 2 00 00 01 01 , ’ P l u s d e p l a c e s d i p o n i b l e s . ’ ) ; END IF ; END; / −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −− C o n t r ai ai n t e 3 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− DROP VIEW e x a m e n s P o s s i b l e s ; CREATE VIEW e x a m e n s P o s s i b l e s AS SELECT codMod FROM MODULE M WHERE
( SELECT COUNT( ∗ ) INSCRIPTION I FROM INSCRIPTION codmod = M.codmod WHERE I . codmod
)
>
0 ;
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− CREATE OR REPLACE TRIGGER beforeInsertUpdateFERExam BEFORE INSERT OR UPDATE ON EXAMEN
FOR EACH ROW DECLARE nbLignes NUMBER; BEGIN SELECT co un t ( ∗ ) INTO nbLignes FROM e x a m e n s P o s s i b l e s codMod od = : new new . codmo codmod d; WHERE codM I F ( n b L ig i g ne n e s = 0 ) THEN RAISE APPLICATION ERROR( − 20002, ’Pas d”´el` e l`ev e dans ce module module . ’ ); END IF ; END; /
109
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −− C o n t r ai ai n t e 4 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− DROP VIEW etudiantsExamens ; CREATE VIEW etudiantsExamens AS .numetud , E. codm codmod od , E. codexa codexam m SELECT I .numetud FROM INSCRIPTION I , EXAMEN E WHERE I .codmod = E.codmod dateExam m; AND I . d a t e I n s c < E. dateExa
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− CREATE OR REPLACE TRIGGER b e f o r e I n s e r t U p d a t e F E R R e s u l t BEFORE INSERT OR UPDATE ON RESULTAT
FOR EACH ROW DECLARE nbLignes NUMBER; BEGIN SELECT co un t ( ∗ ) INTO nbLignes FROM etudiantsExamens numetud d = : new new . numetu numetud d WHERE numetu codmod d = : new new . codmod codmod AND codmo codexam = : new new . codexam codexam ; AND codexam I F ( n b L ig i g ne n e s = 0 ) THEN RAISE APPLICATION ERROR( − 20002, ’Exa ’Examen men ant ´ er e r ie ur ` a l ” i n s c r i p t i o n d an an s l e m od od u ull e . ’ ) ; END IF ; END; / −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −− C o n t r ai ai n t e 5 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −− On c r ´ e e u ne ne t a b l e t e m p o r a i r e c o n t e n a n t l e s mˆ emes v a l e u r s q u e p r e r e q u i s , −− On l a me t ` a j o u r AV AVANT l a t a b l e p r e r e q u i s p ou ou r v ´ e r i f i e r q ue ue l ’ i n s e r t i o n −− n e c o n s t r ui u i t p as as d e c i r c u i t .
REPLACE FUNCTION FUNCTION CREATE OR REPLACE f i n d M o du du l e ( r o o t number , moduleToFind moduleToFind number ) RETURN BOOLEAN IS CURSOR C I S SELECT codmod FROM MIRRORPREREQ mo d p rre ereq = root ; WHERE c o d mo
SON C%row ty pe ; BEGIN FOR FOR SON IN C LOOP LOOP IF ( son . codmo codmod d = moduleToFind moduleToFind OR findModule ( son . codm codmod od , moduleT moduleToFi oFind) nd) ) THEN
RETURN TRUE; END IF ;
LOOP; END LOOP; RETURN FALSE; END;
/ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− CREATE OR REPLACE PROCEDURE
i n s e r t M i r r o r P r e r e q ( c od od mo mo dV dV al al u e NUMBER, c o d mo mo d p rre e r e q Va Va l u e NUMBER, n ot o t e NUMBER) IS BEGIN INSERT INTO MIRRORPREREQ
(codm (codmod od , codmodprereq codmodprereq , noteMin) noteMin) VALUES
(codmodV (codmodValu alue e , codmodprereqValue codmodprereqValue , note ); END;
/
110
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− CREATE OR REPLACE PROCEDURE
d e l e t e M i r r o r P r e r e q ( c od od mo mo dV dV al al u e NUMBER, c o d mo mo d p rre e r e q Va Va l u e NUMBER) IS BEGIN DELETE FROM MIRRORPREREQ codmod = codmodValue WHERE codmod codmodprereq = codmodprereqValue codmodprereqValue ; AND codmodprereq END;
/ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− CREATE OR REPLACE PROCEDURE
updateMirrorPrereq (codmodValue NUMBER, codmodNewValue NUMBER, codmodprereqValue NUMBER, codmodprereqNewValue NUMBER, newNote NUMBER) IS BEGIN UPDATE MIRRORPREREQ SET
/ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− CREATE OR REPLACE TRIGGER a f t e r D e l e t e F E R P r e r e q AFTER DELETE ON PREREQUIS
FOR EACH ROW BEGIN d e l e t e M i r r o r P r e r e q ( : o l d . c od od mo mo d , END; /
: o l d . c o d mo mo d pr pr e r eq eq ) ;
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− CREATE OR REPLACE TRIGGER b e f o r e I n s e r t U p d a t e F E R P r e r e q BEFORE INSERT OR UPDATE ON PREREQUIS
FOR EACH ROW BEGIN IF INSERT INSERTING ING THEN i n s e r t M i r r o r P r e r e q ( : n ew ew . c od od mo mo d , : n ew ew . c od od m od od p re re r e q , : n e w . n o te te M in in ) ; END IF ; IF UPDA UPDATI TING NG THEN updateM irrorP rereq (: old . codm codmod od , : new. new. codm codmod od , : old . codmodprereq codmodprereq , :new. codmodprereq codmodprereq , : new. new. noteMin noteMin ); END IF ; I F ( f i n d M o du du l e ( : n ew ew . c od od mo mo d , : n e w . c o dm dm od od ) ) THEN IF INSERT INSERTING ING THEN d e l e t e M i r r o r P r e r e q ( : ne w . c od od mo mod , : n ew ew . c od od m o dp dp r e re re q ) ; END IF ; I F UPDA UPDATI TING NG THEN update Mirror Prere q (: new. new. codm codmod od , : old . codm codmod od , : new. new. codmodprer codmodprereq eq , : old . codmodprereq codmodprereq , : old . noteMin noteMin ); END IF ; RAISE APPLICATION ERROR( − 2 00 00 03 03 , ’ C i r c u i t d an an s p r e r e q u i s . ’ ) ; END IF ; END;
/ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −− C o n t r ai ai n t e 6 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
REPLACE FUNCTION FUNCTION CREATE OR REPLACE c h e c k I n s c r i p t i o n ( e t ud u d NUMBER, mod NUMBER) RETURN BOOLEAN IS CURSOR pr er eq IS noteMin , codmodprereq codmodprereq SELECT noteMin FROM MIRRORPREREQ codmod = mod; mod; WHERE codmod p pre req%rowtype req%rowtype ; nbLignes NUMBER; BEGIN
111
FOR p IN pr er eq LOOP SELECT co un t ( ∗ ) INTO nbLignes FROM RESULTAT codmod d = p . codmodprereq WHERE codmo numetud d = etud AND numetu AND n o t e < p . noteMin ; I F ( n b L ig ig n es es = 0 ) THEN RETURN FALSE; END IF ;
LOOP; END LOOP; RETURN TRUE; END;
/ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− CREATE OR REPLACE TRIGGER b e f o r e I n s e r t U p d a t e F E R I n s c BEFORE INSERT OR UPDATE ON INSCRIPTION
FOR EACH ROW DECLARE nbLignes NUMBER; BEGIN SELECT co un t ( ∗ ) INTO nbLignes FROM m o d u l e s D i s p o n i b l e s codmod od = : new. new. codm codmod; od; WHERE codm I F ( n b L ig i g ne n e s = 0 ) THEN RAISE APPLICATION ERROR( − 2 00 00 01 01 , ’ P l u s d e p l a c e s d i p o n i b l e s . ’ ) ; END IF ; IF (NOT( c h e c k I n s c r i p t i o n ( : ne w . n u me me tu tu d , : n ew ew . c od od mo mo d ) ) ) THEN RAISE APPLICATION ERROR( − 2 00 00 04 04 , ’ P r ´ e r e q u i s n on on s a t i s f a i t . ’ ) ; END IF ; END; / −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −− C o n t r ai ai n t e 7 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −− −− −− −−
La la le les
a u s si s i u n p ro r o bl bl em e m e s e p os os e , o n n e p eu e u t p as as f a i r e d e r e qu q u e t e s ur ur t a b l e r e s u l t a t , comme d e p lu l u s , on t i e n t ` a p r en en d re re p ou ou r c ha ha qu qu e e t u d i a n t m e i l l e u r e n o te te d an an s c ha ha qu qu e m od od ul ul e , on c r ee e e u ne ne t a b l e t e mp mp o ra ra i re r e c o nt nt e na na n t n o te te s o be b e tn t n u es es p ar ar l e s e l e v e s .
MEILLEURENOTE;; DROP VIEW MEILLEURENOTE CREATE VIEW MEILLEURENOTE AS numetud , codmod codmod , MAX( note ) AS noteMax SELECT numetud FROM MIRRORRESULT numetud , codmod codmod ; GROUP BY numetud
NOMBREINSCRIPTIONs;; DROP VIEW NOMBREINSCRIPTIONs CREATE VIEW NOMBREINSCRIPTIONS AS SELECT numetud ,
( SELECT COUNT( ∗ ) INSCRIPTION I FROM INSCRIPTION numetud d = E . numetu numetud d WHERE I . numetu ) AS n b I n s c r i p t i o n s
ETUDIAN IANT T E; FROM ETUD −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− DROP VIEW NOMBRENOTES; CREATE VIEW NOMBRENOTES AS SELECT numetud ,
112
(SELECT COUNT( ∗ ) AS nbNotes MEILLEURENOTE OTE M FROM MEILLEUREN M.numetud = E . numetu numetud d WHERE M.numetud ) AS nbNotes ETUDIAN IANT T E; FROM ETUD −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− CREATE OR REPLACE PROCEDURE updateMoyenne(etud NUMBER)
IS nbNotes NUMBER; n b I n s c r i p t i o n s NUMBER; BEGIN SELECT nbNotes INTO nbNotes FROM NOMBRENOTES numetud d = etud ; WHERE numetu SELECT n b I n s c r i p t i o n s INTO n b I N s c r i p t i o n s FROM NOMBREINSCRIPTIONS numetud d = etud ; WHERE numetu I F ( n b No No te te s = n b I n s c r i p t i o n s ) THEN UPDATE ETUDIANT SET moyenne = (SELECT AVG(noteMax) FROM MEILLEURENOTE numetud d = etud WHERE numetu
) numetud d = etud ; WHERE numetu ELSE UPDATE ETUDIANT SET moyenne moyenne = NULL numetud d = etud ; WHERE numetu END IF ; END;
/ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− CREATE OR REPLACE TRIGGER a f t e r I n s e r t F E R R e s u l t AFTER INSERT ON RESULTAT
FOR EACH ROW BEGIN INSERT INTO MIRRORRESULT VALUES
(: new. new. nu nume metu tud d , : new. new. codm codmod od , : new. new. code codexam xam , updateMoyenne updateMoyenne ( : new new . numetu numetud d );
: new. new. note );
END;
/ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− CREATE OR REPLACE TRIGGER afterUpdateFERResult AFTER UPDATE ON RESULTAT
FOR EACH ROW BEGIN UPDATE MIRRORRESULT SET
numetu numetud d = : new new . numet numetud ud , codmod codmod = : new new . codm codmod od , codexam codexam = : new new . codexam codexam , n o t e = : n ew ew . n o t e numetud d = : old . numetu numetud d WHERE numetu codmod d = : old . codmod codmod AND codmo codexam = : old . codexam codexam ; AND codexam updateMoyenne updateMoyenne ( : new new . numetu numetud d ); END;
/ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− CREATE OR REPLACE TRIGGER a f t e r D e l e t e F E R R e s u l t AFTER DELETE ON RESULTAT
FOR EACH ROW BEGIN DELETE FROM MIRRORRESULT numetud d = : new new . numetu numetud d WHERE numetu codmod d = : new new . codmod codmod AND codmo codexam = : new new . codexam codexam ; AND codexam
updateMoyenne updateMoyenne ( : new new . numetu numetud d ); END;
/ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −− C o n t r ai ai n t e 9 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
REPLACE FUNCTION FUNCTION CREATE OR REPLACE checkAllStudents RETURN BOOLEAN IS CURSOR C I S numetud , codmod codmod SELECT numetud INSCRIPTION; FROM INSCRIPTION; e C%rowtype ; BEGIN FOR e IN C LOOP LOOP IF (NOT( c h e c k I n s c r i p t i o n ( e . n um um et et ud ud , e . c od od mo mo d ) ) ) THEN RETURN FALSE; END IF ; LOOP; END LOOP; RETURN TRUE; END;
/ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− CREATE OR REPLACE TRIGGER BeforeUpdateFERModule BEFORE UPDATE ON MODULE
FOR EACH ROW BEGIN I F ( : new . e f f e c m a x < : n ew ew . e f f e c ) THEN RAISE APPLICATION ERROR( − 20005, ’ L e f f e c t i f n e p e ut ut ˆ etre en dessous de ’ END IF ; END; /
||
: n ew ew . e f f e c ) ;
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −− C o n t r ai ai n t e 8 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− CREATE OR REPLACE TRIGGER b e f o r e I n s e r t U p d a t e F E R P r e r e q BEFORE INSERT OR UPDATE ON PREREQUIS
FOR EACH ROW BEGIN IF INSERT INSERTING ING THEN i n s e r t M i r r o r P r e r e q ( : n ew ew . c od od mo mo d , : n ew ew . c od od m od od p re re r e q , : n e w . n o te te M in in ) ; END IF ; IF UPDA UPDATI TING NG THEN updateM irrorP rereq (: old . codm codmod od , : new. new. codm codmod od , : old . codmodprereq codmodprereq , :new. codmodprereq codmodprereq , : new. new. noteMin noteMin ); END IF ; I F ( f i n d M o du du l e ( : n ew ew . c od od mo mo d , : n e w . c o dm dm od od ) ) THEN IF INSERT INSERTING ING THEN d e l e t e M i r r o r P r e r e q ( : ne w . c od od mo mod , : n ew ew . c od od m o dp dp r e re re q ) ; END IF ; I F UPDA UPDATI TING NG THEN update Mirror Prere q (: new. new. codm codmod od , : old . codm codmod od , : new. new. codmodprer codmodprereq eq , : old . codmodprereq codmodprereq , : old . noteMin noteMin ); END IF ; RAISE APPLICATION ERROR( − 2 00 00 03 03 , ’ C i r c u i t d an an s p r e r e q u i s . ’ ) ; END IF ; IF (NOT( c h e c k A l l S t u de de n t s ( ) ) ) THEN IF INSERT INSERTING ING THEN d e l e t e M i r r o r P r e r e q ( : n ew ew . c od od mo mod , : n ew ew . c od od m o dp dp r e re re q ) ; END IF ; I F UPDA UPDATI TING NG THEN update Mirror Prere q (: new. new. codm codmod od , : old . codm codmod od , : new. new. codmodprer codmodprereq eq , : old . codmodprereq codmodprereq , : old . noteMin noteMin ); END IF ; RAISE APPLICATION ERROR( − 2 00 00 06 06 , ’ I m p o s s i bl b l e d e d i mi mi n ue ue r c e t t e n ot ot e . ’ ) ; END IF ; END;
/ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −− Q u el el qu q u es e s i n s e r t i o n s p ou ou r t e s t e r −−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− INSERT INTO ETUDIANT VALUES
( (SELECT nvl (MAX(nu (numE mEtu tud) d) , 0) + 1 FROM ETUDIANT) , ’ Fourier ’ , ’ Joseph ’ , to dat e ( ’21031768 ’ , ’ddm ’ddmmyyyy ’ ) , ’Mr ’Mr ’ , NULL, ’ 168031234567890 ’ , NULL
);
114
INSERT INTO MODULE
(codMod , nomM nomMod) od) VALUES
( (SELECT nvl (MAX( c od od M Mo o d ) , 0 ) + 1 FROM MODULE) , ’Maths ’ ); INSERT INTO INSCRIPTION
(codMod, (codMod, numEt numEtud) ud) VALUES
( (SELECT numEtud FROM ETUDIANT WHERE nom = ’ Four ier ’ ) , (SELECT codMod FROM MODULE WHERE nomM nomMod od = ’ Maths ’ ) ); INSERT INTO EXAMEN VALUES
( (SELECT codMod FROM MODULE WHERE nomM nomMod od = ’ Maths ’ ) , 1, to dat e ( ’02012008 ’ , ’ddm ’ddmmyyyy ’ ) ); INSERT INTO RESULTAT VALUES
( (SELECT codMod FROM MODULE WHERE nomM nomMod od = ’ Maths ’ ) , 1, (SELECT numEtud FROM ETUDIANT WHERE nom = ’ Four ier ’ ) , 19 ); UPDATE RESULTAT SET
note = 20 wHERE
numEt numEtud ud = (SELECT numEtud FROM ETUDIANT WHERE nom = ’ Four ier ’ ) codMod od = (SELECT codMod FROM MODULE WHERE nomM nomMod od = ’ Maths ’ ) AND codM codExa xam m = 1; AND codE INSERT INTO MODULE VALUES
(2 ,
’ A l go go ’ , 3 0 , 2 2 ) ;
INSERT INTO PREREQUIS VALUES
(1 , 2 , 10); INSERT INTO PREREQUIS VALUES
(2 , 1 , 10); te M in in = 2 ; UPDATE PREREQUIS SET n o te INSERT INTO EXAMEN VALUES ( 2 ,
1 , s y s d a te te ) ;
115
3.17 3.17
Pack ackages ages
PACKAGE BO BODY g e s t i o n a r b r e CREATE OR REPLACE PA
IS
c u r s o r f e u i l l e s r e t u r n p e r s on on n e% e%r ow ow ty ty pe pe I S PERSONNE; SELECT ∗ FROM PERSONNE; PROCEDURE aj ou te Pe rs on ne (nom (nom pe rs onn e .nom%type , prenom prenom person ne . preno prenom m%type , pere personn e . pere%type pere%type , mere mere personn e . mere mere%type ) IS BEGIN INSERT INTO PERSONNE VALUES ( (SELECT nvl (MAX( n um um pe pe rs rs ) , 0 ) + 1 FROM PERSONNE) , nom, pren prenom om , pere , mere ); END; FUNCTION desc endDe ( numpers pe rs onn e . numpers%type numpers%type , des ce nda nt per so nne . numpers%type numpers%type ) RETURN BO BOOLEAN IS BEGIN I F ( d e s c e nd nd a n t I S NULL) THEN RETURN FALSE; ELSI ELSIF F ( descen dant = numpers) numpers) THEN RETURN TRUE; ELSE
DECLARE p e r s PERSONNE%row ty pe ; BEGIN SELECT ∗ INTO p e r s FROM PERSONNE numpers = descen dant ; WHERE numpers RETURN descendDe (numpers , pe rs . pere ) descendDe(numpers , per s . mere mere ); OR descendDe(numpers END; END IF ; END;
p r o c e d u r e m o d i f i e P a r e n t s ( p e r s p e r s o n n e . n um um p pe e rs rs%t y p e , nu numP mPer ere e person ne . pere%type pere%type , nu numM mMer ere e person ne . mere mere%type ) IS BEGIN I F ( d e s c e n dD dD e ( p e r s , n um um Pe Pe re re ) OR descendDe( pers , nu numM mMer ere) e) ) THEN RAISE CIRCUIT CIRCUIT ; END IF ; numPere , mere = numM numMer ere e UPDATE PERSONNE SET per e = numPere numPe mPers rs = pers ; WHERE nu END; END;
/ CALL g e s t i o n A r b r e . m o d i f i e P a r e n t s ( 2 0 , 1 4 , 1 5 ) ;
116
3.18
R´ evisions evision s
−− P r e p a r a t i f s . . .
PERSONNE;; DROP TABLE MIRRORPERSONNE CREATE TABLE MIRRORPERSONNE
( numpers NUMBER PRIMARY KE KEY, p e r e NUMBER, mere NUMBER ); CREATE OR REPLACE TRIGGER miseAJourMirrorPersonne BEFORE UPDATE OR INSERT OR DELETE ON PERSONNE
FOR EACH ROW BEGIN IF DELETI DELETING NG OR UPDATING THEN DELETE FROM MIRRORPERSONNE WHERE numpers = : old . numpers ; END IF ; IF INSERT INSERTING ING OR UPDATING THEN INSERT INTO MIRRORPERSONNE VALUES (: new. new. numper numperss , : new. new. pere , :new. mere mere ); END IF ; END; / GE ; DROP TABLE MIRRORMARIAGE; CREATE TABLE MIRRORMARIAGE
( nummari NUMBER, numfemme NUMBER, d a t e m a r i a g e DATE, d a t e d i v o r c e DATE ); CREATE OR REPLACE TRIGGER miseAJourMirrorMariage BEFORE UPDATE OR INSERT OR DELETE ON MARIAGE
FOR EACH ROW BEGIN IF DELETI DELETING NG OR UPDATING THEN DELETE FROM MIRRORMARIAGE nummari ri = : old .nummar .nummarii WHERE numma numfemme me = : old . numfem numfemme me AND numfem AND d a t e m a r i a g e = : o l d . d a t e m a r i a g e ; END IF ; IF INSERT INSERTING ING OR UPDATING THEN INSERT INTO MIRRORMARIAGE VALUES ( : ne w . n u mm mm ar ar i , : n ew ew . numfemme , : n ew ew . d at at e m a r i a ge ge , : n e w . d a t e d i v o r c e ) ; END IF ; END; / −− C o n t r ai ai n t e 1 ALTER TABLE PERSONNE ADD CONSTRAINT c k p a r e n t s d i f f e r e n t s CHECK( pere <> mere ) ;
−− C o n t r ai ai n t e 2 CREATE OR REPLACE PACKAGE c on tr ai nt eC i r cu i t CIRCUIT EXCEPTION;
IS
PROCEDURE v e r i f i e Ci r c u i t ( pe rs per sonn e . numpers numpers%type ) ; FUNCTION desc endDe ( numpers pe rs onn e . numpers% numpers%type , de sc en da nt pe rs on ne . numpe rs%ty rs%ty pe ) RETURN BO BOOLEAN; END;
/ CREATE OR REPLACE TRIGGER v e r i f i e C o n t r a i n t e C i r c u i t AFTER UPDATE OR INSERT ON PERSONNE
FOR EACH ROW BEGIN c o n t r a i n t e C i r c u i t . v e r i f i e C i r c u i t ( : new . n u m P e rs rs ) ; END; / PACKAGE BO BODY c on t ra i nt e Ci rc ui t CREATE OR REPLACE PA
IS
FUNCTION desc endDe ( numpers pe rs onn e . numpers%type numpers%type , des ce nda nt per so nne . numpers%type numpers%type ) RETURN BO BOOLEAN IS BEGIN I F ( d e s c e nd nd a n t I S NULL) THEN RETURN FALSE; ELSI ELSIF F ( descen dant = numpers) numpers) THEN RETURN TRUE; ELSE
DECLARE
117
p e r s MIRRO IRRORPERS ERSONNE%ro wt yp e ; BEGIN SELECT ∗ INTO p e r s FROM MIRRORPERSONNE numpers = descen dant ; WHERE numpers
RETURN descendDe (numpers , pe rs . pere ) descendDe(numpers , per s . mere mere ); OR descendDe(numpers END; END IF ; END;
PROCEDURE ve ri fi e Ci rc ui t ( per s personn e . numper numperss%type ) IS l i g n e m i r r o r p e r s o n n e %r %r o w ty ty p e ; BEGIN SELECT ∗ INTO LIGNE FROM m i r r o r p e r s o n n e um p pe e rs rs = p e r s ; WHERE n um I F ( d e s ce ce n nd d D e ( p e r s , l i g n e . p e r e ) OR d e s ce ce n dD dD e ( p e r s , l i g n e . m er er e ) ) THEN RAISE CIRCUIT CIRCUIT ; END IF ; END; END;
/ −− C o n t r ai ai n t e 3
or c e I S NULL OR dateMariage <= ALTER TABLE MARIAGE ADD CONSTRAINT c k d a t e s m a r i a g e CHECK( d a t e D i v or
d a te t e D i vo vo r c e ) ;
ai n t e 4 −− C o n t r ai
PACKAGE co nt ra in te sM ar ia ge s CREATE OR REPLACE PA m a r i a g e s S u p e r p o s e s EXCEPTION;
IS
PROCEDURE ve ri fi eM ari age sSu pe rpo se s (nouveauMariage (nouveauMariage mariage% mariage%rowtype ); END c o n t r a i n t e s M a r i a g e s ;
/ CREATE OR REPLACE TRIGGER v e r i f i e C o n t r a i n t e s M a r i a g e s BEFORE UPDATE OR INSERT ON MARIAGE
FOR EACH ROW DECLARE nou ve auM ari age MARIAGE%rowty pe ; BEGIN nouveauMariage . numM numMar arii := : new. new. numM numMar arii ; nouve auMar iage .num .numFemme emme := : new. numFem mFemme; me; nouveauMariage nouveauMariage . dateMariage := : new. new. dateMariage ; n o uv uv e a uM uM a r ia ia g e . d a t e D i v o r c e : = : n e w . d a t e D i v o r c e ; c o n t r a i n t e s M a r i a g e s . v e r i f i e M a r i a g e s S u p e r p o s e s ( n o uv uv e au au Ma Ma r ia ia ge ge ) ; END;
/ PACKAGE BODY c on tr ai nt e s Ma ri ag e s IS CREATE OR REPLACE PA FUNCTION se Su pe rp os en t (m1 mi rr or Mar ia ge%rowtype ge%rowtype , m2 mi rr orM ari age%rowtype ) RETURN BO BOOLEAN IS BEGIN IF (m1. (m1. numma nummari ri <> m2. nummari nummari OR m1. numfemme numfemme <> m2. numfemme) numfemme) THEN RETURN FALSE; END IF ; RETURN NOT( ( m2 m2 . d a t e d i v o r c e I S NOT NULL AND m1. date Mariage <= m2. dateDiv orce ) m1 . d a t e d i v o r c e I S NOT NULL AND m2. dateMariage <= m1. dateDiv orce ) OR ( m1 ); END; PROCEDURE ve ri fi eM ari age sSu pe rpo se s ( nouveauMariage nouveauMariage mariage% mariage%rowtype) IS CURSOR au tre sM ari age s IS SELECT ∗ FROM MIRRORMARIAGE numMarii = nouve auMar iage . numMar numMarii WHERE numMar numF mFem emme me = nou ve auM ari age . nu numF mFem emme; me; OR nu aut re Mar ia ge au tr es Ma ri ag es%ROWTYPE; BEGIN FOR autreMa riage IN autr esM aria ges LOOP I F ( s e S u p e r p o s e n t ( n o uv uv e a uM uM a ri ri a g e , a u t r e M a r i a g e ) ) THEN RAISE ISE mari agesS uperp oses ; END IF ; END LOOP; END; END c o n t r a i n t e s M a r i a g e s ;
/ nt r ai a i n te te s 5 e t 6 −− C o nt CREATE OR REPLACE package con tra int esT ran s t r a n s EXCEPTION;
IS
PROCEDURE ve r i f i e P e r eM e re ( no uv el l eP er so nn e MIRRORPERSONNE%rowty pe ) ; PROCEDURE ve ri fi eM ar iF em me ( nou ve auM ari age MARIAGE%rowt ype );
118
end c o n t r a i n t e s T r a n s ;
/ CREATE OR REPLACE TRIGGER pereMere AFTER UPDATE OR INSERT ON PERSONNE
FOR EACH ROW DECLARE n ou v e l l e P e rs on n e MIRRORPERSONNE%row ty pe ; BEGIN n o u v e l l e P e r s o n n e . n um um p pe e r s : = : n e w . n um um p pe ers ; n o u v e l l e P e r s o n n e . p e r e : = : n ew ew . p e r e ; n o u v e l l e P e r s o n n e . m e re re : = : n ew ew . m e re re ; contraintesTrans . verif iePereMe re ( nouvellePersonne ); END; / CREATE OR REPLACE TRIGGER mariFemme AFTER UPDATE OR INSERT ON MARIAGE
FOR EACH ROW DECLARE nou ve auM ari age MARIAGE%rowty pe ; BEGIN nouveauMariage . numM numMar arii := : new. new. numM numMar arii ; nouve auMar iage .num .numFemme emme := : new. numFem mFemme; me; nouveauMariage nouveauMariage . dateMariage := : new. new. dateMariage ; n o uv uv e a uM uM a r ia ia g e . d a t e D i v o r c e : = : n e w . d a t e D i v o r c e ; c o n t r a i n t e s T r a n s . v e r i f i e M a ri ri F e m m e ( n o u ve ve a u Ma Ma r i ag ag e ) ; END; / CREATE OR REPLACE package BODY co nt ra in te sT ra ns
IS
PROCEDURE ve r i f i e P e r eM e re ( no uv el l eP er so nn e MIRRORPERSONNE%rowty pe ) IS nb IN INT T; BEGIN SELECT COUNT( ∗ ) INTO nb FROM MIRRORPERSONNE re WHERE p e r e = n o u v e l l e P e r s o n n e . m e re er e = n o u v e l l e P e r s o n n e . p e r e ; OR m er I F ( n b <> 0) THEN RAISE TRAN TRANS; S; END IF ; SELECT COUNT( ∗ ) INTO nb FROM MIRRORMARIAGE numM mMar arii = nouv ell ePe rson ne . mere mere WHERE nu OR numFemme = nou ve ll eP ers onn e . per e ; I F ( n b <> 0) THEN RAISE TRAN TRANS; S; END IF ; END; PROCEDURE ve ri fi eM ar iF em me ( nou ve auM ari age MAR MARIAGE%rowt ype ) IS nb IN INT T; BEGIN SELECT COUNT( ∗ ) INTO nb FROM MIRRORMARIAGE numMari = nou ve auM ari age . nu numF mFem emme me WHERE numMari mFemm me = nouve auMar iage . numMar numMarii ; OR numFem I F ( n b <> 0) THEN RAISE TRAN TRANS; S; END IF ; SELECT COUNT( ∗ ) INTO nb FROM MIRRORPERSONNE .numFemme emme WHERE pe re = nouve auMar iage .num numMar arii ; OR mere = nouveauMariage . numM I F ( n b <> 0) THEN RAISE TRAN TRANS; S; END IF ; END; END c o n t r a i n t e s T r a n s ;
/ −− C o n t r ai ai n t e 7
PACKAGE co nt ra in te Ma ri age Con sa ng ui n IS CREATE OR REPLACE PA MariageConsanguin EXCEPTION; PROCEDURE ve ri fi eM ar ia ge Co ns an gu in ( nouve auMar iage MARIAGE%rowtype ) ; END c o n t r a i n t e M a r i a g e C o n s a n g u i n ;
/ CREATE OR REPLACE TRIGGER mariageConsanguin AFTER UPDATE OR INSERT ON MARIAGE
FOR EACH ROW DECLARE nou ve auM ari age MARIAGE%rowty pe ; BEGIN
119
nouveauMariage . numM numMar arii := : new. new. numM numMar arii ; nouve auMar iage .num .numFemme emme := : new. numFem mFemme; me; nouveauMariage nouveauMariage . dateMariage := : new. new. dateMariage ; n o uv uv e a uM uM a r ia ia g e . d a t e D i v o r c e : = : n e w . d a t e D i v o r c e ; c o n t r a i n t e M a r i a g e C o n s a n g u i n . v e r i f i e M a r i a g e C o n s a n g u i n ( n o u v e au au M a ri ri a g e ) ; END;
/ PACKAGE BODY co nt ra in te Ma ri ag eC on sa ng ui n IS CREATE OR REPLACE PA FUNCT UNCTION ION p e r e ( p PERSONNE. nu mp er s%ty pe ) RETURN PER PERSONNE. nu mp er s%ty pe IS numPere PERSONNE. nu mpe rs%typ e ; BEGIN SELECT p e r e INTO numPere FROM MIRRORPERSONNE WHERE n u m p e r s = p ; RETURN numP ere ; EXCEPTION WHEN NO DATA FOUND THEN RETURN NULL; END;
FUNCT UNCTION ION me re ( p PERSONNE. nu mp er s%ty pe ) RETURN PER PERSONNE. nu mp er s%ty pe IS numMere PERS ERSONNE. nu mp er s%ty pe ; BEGIN SELECT mere INTO numMere FROM MIRRORPERSONNE WHERE n u m p e r s = p ; RETURN numMere numMe re ; EXCEPTION WHEN NO DATA FOUND THEN RETURN NULL; END;
FUNCTION rec her che Anc etr eCom mun ( a PERSONNE. numper s%type , b PERS PERSON ONNE. NE. nu mp er s%ty p e ) RETURN BOOL BOOLEAN I S BEGIN I F ( a I S NULL) THEN RETURN FALSE; ELSE
RETURN ( co nt ra in te Ci rc ui t . descendDe(a , b) ) OR rechercheAnc rechercheAncetreCo etreCommun( mmun( pere (a) , b) OR rechercheAncet END IF ; END;
PROCEDURE ve ri fi eM ar ia ge Co ns an gu in ( nouve auMar iage MARIAGE%rowtype ) IS BEGIN IF ( rechercheAncetreCommun( nouveauMariage . numM numMar arii , nouveauMariage .num .numFemme) ) THEN RAIS RAISE E MariageCon sanguin ; END IF ; END; END c o n t r a i n t e M a r i a g e C o n s a n g u i n ; /
120
Annexe A
Scripts Scripts de cr´ eation eation de bases bases A.1
Livrai Livraison sonss Sans Sans contra contrain intes tes
Attention : Le L e num´ero ero de livraison l ivraison est une cl´e secondaire, sec ondaire, c’est-`a-dire a-d ire un num´ero ero unique uni que ´etant etant donn´ don n´e un fournis fou rnisseur seur.. CREATE TABLE PRODUIT (numprod number , nomprod varchar2 ( 3 0 ) ) ; CREATE TABLE FOURNISSEUR (numfou number , nomfou varchar2 ( 3 0 ) ) ; CREATE TABLE PROPOSER (numfou number , numprod number , p r i x number ) ; CREATE TABLE LIVRAISON (numfou number , numli number , d a t e l i d at at e d e f a u l t s y s d a t e
); CREATE TABLE DETAILLIVRAISON (numfou number , numli number , numprod number , q t e number ) ;
121
A.2 A.2
Modul Modules es et prer prereq equi uiss
les modules sont r´ epertori´ epertori´es es dans une table, et les modules pr´ e-requis e-requis pour s’y inscrire (avec la note minimale) se trouvent dans la table prerequis. Une ligne de la table PREREQUIS nous indique que pour s’inscrire dans le module num´ nu m´ero numMod, il faut avoir eu au moins noteMin au module numModPrereq. CREATE TABLE MODULE (numMod nu numb mber er primary key , nomMod varchar2 ( 3 0 )
); CREATE TABLE PREREQUIS
( numMod number r e f e r e n c e s MODULE(num E(numM Mod) , numModPrereq number r e f e r e n c e s MODULE(num E(numMo Mod) d) , noteMin number ( 2 ) DEFAULT 10 NOT NULL , (numMod, od, numModPrereq numModPrereq ) PRIMARY KEY(numM ); MODULE MODULE MODULE MODULE MODULE MODULE MODULE INSERT INTO MODULE INSERT INSERT INSERT INSERT INSERT INSERT INSERT
La table INTERVALLE contient des intervalles sp´ecifi´ ecifi´es es par leurs bornes inf´erieure erieure et sup´erieure. erieure. Supprimer Supprim er de la table intervalle tous les intervalles qui n’en sont pas avec une seule instruction. CREATE TABLE INTERVALLE ( b o r n e I n f NUMBER, borneSup NUMBER, rn e S up up ) ) ; PRIMARY KEY ( b o r n e I n f , b o rn CREATE TABLE RECTANGLE (xHautGauche NUMBER, yHautGauche NUMBER, xBasDroit NUMBER, yBasDroit NUMBER, (xHautGauc uche he , yHaut yHautGau Gauch che e, PRIMARY KEY (xHautGa INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT
CREATE TABLE PRODUIT (numprod number , nomprod varchar2 ( 3 0 ) ) ; CREATE TABLE FOURNISSEUR (numfou number , nomfou varchar2 ( 3 0 ) ) ; CREATE TABLE PROPOSER (numfou number , numprod number , p r i x numb number er NOT NULL) ; CREATE TABLE LIVRAISON (numfou number , numli number , d a t e l i d at at e d e f a u l t s y s d a t e
); CREATE TABLE DETAILLIVRAISON (numfou number , numli number , numprod number , q t e numb number er NOT NULL) ; a l t e r t a bl bl e PRIMARY KEY a l t e r t a bl bl e PRIMARY KEY a l t e r t a bl bl e PRIMARY KEY a l t e r t a bl bl e PRIMARY KEY a l t e r t a bl bl e PRIMARY KEY a l t e r t a bl bl e FOREIGN KEY a l t e r t a bl bl e FOREIGN KEY a l t e r t a bl bl e FOREIGN KEY a l t e r t a bl bl e FOREIGN KEY a l t e r t a bl bl e FOREIGN KEY
p r o d u i t ad d c o n s t r a i n t p k p r o d u i t (numprod ) ; f o u r n i s s e u r add c o n s t r a i n t p k f o u r n i s s e ur ur (numfou ) ; p r o p o s e r ad d c o n s t r a i n t p k p r o p o s e r (numfou , numprod numprod ) ; l i v r a i s o n add c o n s t r a i n t p k l i v r a i so so n (numfo (numfou u , numli ); d e t a i l l i v r a i s o n ad d c o n s t r a i n t p k d e t a il i l l i v r a is is o n (numfou (numfou , numli , numpro numprod d); p r o p o s e r ad d c o n s t r a i n t f k p r o p o s e r f o u r n i s s e u r (numfou) REFERENCES fo ur ni ss eu r (numfou ) ; p r o p o s e r ad d c o n s t r a i n t f k p r o p o s e r p r o d u i t (numprod) REFERENCES pr od ui t (numprod ) ; l i v r a i s o n add c o n s t r a i n t f k l i v r a i s o n (numfou) REFERENCES fo ur ni ss eu r (numfou ) ; d e t a i l l i v r a i s o n ad d c o n s t r a i n t f k d e t a i l l i v r a i s o n (numfo (numfou u , numli) REFERENCES li vr ai so n (numfo (numfou u , numli ); d e t a i l l i v r a i s o n ad d c o n s t r a i n t f k d e t a i l l i v r a i s o n p r o p o s e r (numfou , numprod) numprod) REFERENCES pr op os er (numfou , numprod numprod ) ;
INSERT INTO PRODUIT values INSERT INTO PRODUIT values INSERT INTO PRODUIT values INSERT INTO PRODUIT values INSERT INSERT INSERT INSERT
INTO INTO INTO INTO
FOURNISSEUR FOURNISSEUR FOURNISSEUR FOURNISSEUR
INSERT INSERT INSERT INSERT
INTO INTO INTO INTO
PROPOSER PROPOSER PROPOSER PROPOSER
(1 , (2 , (3 , (4 ,
values values values values
values values values values
(1 , (1 , (2 , (3 ,
LIVRAI AISO SON N (numfou , INSERT INTO LIVR LIVRAI AISO SON N (numfou , INSERT INTO LIVR LIVRAI AISO SON N (numfou , INSERT INTO LIVR INSERT INSERT INSERT INSERT INSERT
’ Ro R ou e d e s e c o u r s ’ ) ; ˜ c e Batma ’Po ’PoupA Batman n ’ ); ’ C ot o t on on s t i g e s ’ ) ; ’ Cornichons ’ ); (1 , (2 , (3 , (4 , 1, 2, 2, 3,
’ f1 ’ f2 ’ f3 ’ f4
’ ); ’ ); ’ ); ’ );
2 0 0 ); ); 15); 1); 2);
numl i ) values ( 1 , 1 ) ; numl i ) values ( 1 , 2 ) ; numl i ) values ( 3 , 1 ) ;
values values values values values
(3 , (1 , (1 , (1 , (1 ,
1, 1, 1, 2, 2,
3, 1, 2, 1, 2,
10); 25); 20); 15); 17);
124
A.5
Arbre Arb re g´ en´ en´ ealog eal ogiqu ique e
La table PERSONNE, le champ pere contient le num´ero ero du p`ere ere de la personne, perso nne, le champ mere contient conti ent le num´ero ero de la m` ere ere de la personne. p ersonne. CREATE TABLE PERSONNE (numpers nu numb mber er PRIMARY KEY, nom varchar2 ( 3 0 ) NOT NULL, prenom varchar2 ( 3 0 ) ,
p e r e REF REFEREN ERENC CES PERS PERSONNE( num pe rs ) , me re REFE REFERE RENC NCES ES PER PERSO SONN NNE( nu mp er s ) ); INSERT INSERT INSERT INSERT INSERT INSERT
INTO INTO INTO INTO INTO INTO
INSERT INTO INSERT INTO INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT
INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO
’ d e M on on tm t m ir i r ai a i l , d i t l e H ar ar di d i ’ , ’ G o de d e fr f r oy oy ’ , NULL, NULL) ; ’ ET ET ’ , NULL, NULL, NULL) ; ’ L e C ro ro qu qu an an t ’ , ’ J a c qo qo u ’ , 1 , 1 6 ) ; ’ La La F r i p o u i l l e ’ , ’ J a c q o u i l l e ’ , 1 , 1 6 ) ; ’ B us us h ’ , ’ K a te te ’ , NULL, NULL) ; ’ G r a n g e r ’ , ’ H e r m io io n e ’ , NULL, NULL ) ; ˜ ˜ c mur’ , ’MA c dor ’ , 3 , 4 ) ; ’ Du Du FA ˜ ¯a ’ K o b a le le v s ka ka A ¯a ’ , ’ S o f i a ’ , NULL, NULL) ; ˜ c ’ , NULL, NULL ) ; ’ Rieu ’ , ’An ’AndrA ’ B o nt nt ou ou to to u ’ , ’ R ex ex ’ , 6 , 4 ) ; ’ D i j k s t r a ’ , ’ E dv dv ar ar d ’ , 2 , 1 3 ) ; ’ L e i b n i z ’ , ’ G o t t f r i e 1 d Wi lh lhem ’ , 8 , 1 2 ) ; ’ B ac ac h ’ , ’ J o ha ha nn nn S e b a s t i e n ’ , 5 , 1 2 ) ; ’ M at a t hi hi eu eu ’ , ’ M i r e i l l e ’ , NULL, NULL ) ; ’ L e m ar ar c ha ha l ’ , ’ G r e g or or y ’ , 1 0 , 1 7 ) ; ’ S o c r a t e ’ , NULL, 3 , 1 3) 3) ; ’ L e r oy oy ’ , ’ N o lw lw en en ’ , NULL, NULL ) ; ’ Bartoli ’ , ’ Jennifer ’ , 9 , 19); ’ F a bi bi an an ’ , ’ L a ra ra ’ , 1 0 , 1 7 ) ; ’ S t o ne ne ’ , ’ S h ar ar on on ’ , 1 5 , 2 0 ) ; ’ F r e ge ge ’ , ’ E l o d ie ie ’ , 7 , 1 3 ) ;
125
A.6 A.6
Comp Compte tess banc bancai aire ress
DROP TABLE DROP TABLE DROP TABLE DROP TABLE DROP TABLE DROP TABLE
CREATE TABLE CLIENT ( n u m c l i number , n o m c l i varchar2 ( 3 0 ) , p r e n o m c l i varchar2 ( 3 0 ) , a d r e s s e varchar2 ( 6 0 ) , t e l varchar ( 1 0 )
); CREATE TABLE PERSONNEL (numpers number , nompers varchar2 ( 3 0 ) , prenompers varchar2 ( 3 0 ) , manager number , s a l a i r e number
); CREATE TABLE TYPECCL ( n u m t y p e c c l number , nomtypeccl varchar2 ( 3 0 )
); CREATE TABLE COMPTECLIENT ( n u m c l i number , numccl number , numtypeccl number , d a t e c c l d at at e d e f a u l t s y s d a t e n ot ot n u l l , numpers number
); CREATE TABLE OPERATION ( n u m c l i number , numccl number , numoper number , numtypeoper number , d a t e o p e r d at at e d e f a u l t s y s d a t e n ot ot n u l l , montantoper nu numb mbe er not nul l , l i b e l o p e r varchar2 ( 3 0 )
); ALTER TABLE CLIENT ADD
( CONSTRAINT p k c l i e n t PRIMARY KEY ( numcli ) , (LENGTH( t e l ) =10 ) CONSTRAINT c k t e l e p h o n e CHECK(LE
); ALTER TABLE PERSONNEL ADD
( ne l PRIMARY KEY (numpers (numpers ) , CONSTRAINT p k p e r s o n ne r e CHECK(SALAIRE >= 1 2 5 4. 4. 2 8 ) CONSTRAINT c k s a l a i re ); ALTER TABLE TYPECCL ADD CONSTRAINT p k t y p e c c l PRIMARY KEY ( n u m t y p e c c l ) ; ALTER TABLE TYPEOPERATION ADD (numtypeoper ) ; CONSTRAINT p k t y p e o p e r a t i o n PRIMARY KEY (numtypeoper ALTER TABLE COMPTECLIENT ADD
( ec l i e n t CONSTRAINT p k c o m p t ec mc ccl) , PRIMARY KEY ( n u m c l i , n u m cl CONSTRAINT f k c c l t y p e c cl FOREIGN KEY ( n u m t y p e c c l ) REFE REFERE RENC NCES ES TYP TYPECCL ( nu mt yp ec cl ) , CONSTRAINT f k c c l c l i e n t FOREIGN KEY ( n u m c l i )
REFE REFERE RENC NCES ES CLIENT CLIENT ( nu mc li ) , CONSTRAINT f k c c l p e r s o n n e l FOREIGN KEY (numpers)
REFE REFERE RENC NCES ES PERS PERSON ONNE NEL L ( nu mp er s ) ); ALTER TABLE OPERATION ADD
(
126
ti o n CONSTRAINT p k o p e r a ti numccl , nu numop moper) er) , PRIMARY KEY ( numcli , numccl CONSTRAINT f k o p e r c c l numo moper) per) FOREIGN KEY ( numcli , nu REFE REFERE RENC NCES ES COMPTECLIENT ( nu mc li , nu mc cl ) , CONSTRAINT f k o p e r c o d e o p e r FOREIGN KEY (numtypeoper)
REFERENCES ty pe op er at io n ( numtypeoper ) , CONSTRAINT m o n t a n t o p e r a t i o n CHECK(montantoper <> 0)
); INSERT INTO TYPECCL VALUES ( (SELECT nvl (MAX( n u m t yp yp e cc cc l ) , FROM TYPECCL
0) + 1
), ’Comp ’Compte te courant ’ ); INSERT INTO TYPECCL VALUES ( (SELECT nvl (MAX( n u m t yp yp e cc cc l ) , FROM TYPECCL
0) + 1
), ’ livret ’ ); INSERT INTO TYPECCL VALUES ( (SELECT nvl (MAX( n u m t yp yp e cc cc l ) , FROM TYPECCL
0) + 1
), ’PEL’ ); INSERT INTO TYPEOPERATION VALUES ( (SELECT nvl (MAX( n u mt mt yp yp eo eo pe pe r ) , FROM TYPEOPERATION
0) + 1
), ˜ ˜ ´t esp A ˜ ¨ces ’ ); c pA ’dA INSERT INTO TYPEOPERATION VALUES ( (SELECT nvl (MAX( n u mt mt yp yp eo eo pe pe r ) , FROM TYPEOPERATION
0) + 1
), ˜ ˜ c lA¨vement ’ pr A ’ ); INSERT INTO TYPEOPERATION VALUES ( (SELECT nvl (MAX( n u mt mt yp yp eo eo pe pe r ) , FROM TYPEOPERATION
0) + 1
), ’ vireme nt ’ ); INSERT INTO TYPEOPERATION VALUES ( (SELECT nvl (MAX( n u mt mt yp yp eo eo pe pe r ) , FROM TYPEOPERATION
0) + 1
), ’ ret rai t ’ );
127
A.7
Compte Comptess banca bancaire iress av avec exce excepti ptions ons
DROP TABLE DROP TABLE DROP TABLE DROP TABLE DROP TABLE DROP TABLE
CREATE TABLE CLIENT ( n u m c l i number , n o m c l i varchar2 ( 3 0 ) , p r e n o m c l i varchar2 ( 3 0 ) , a d r e s s e varchar2 ( 6 0 ) , t e l varchar ( 1 0 )
); CREATE TABLE PERSONNEL (numpers number , nompers varchar2 ( 3 0 ) , prenompers varchar2 ( 3 0 ) , manager number , s a l a i r e number
); CREATE TABLE TYPECCL ( n u m t y p e c c l number , nomtypeccl varchar2 ( 3 0 )
); CREATE TABLE COMPTECLIENT ( n u m c l i number , numccl number , numtypeccl number , d a t e c c l d at at e d e f a u l t s y s d a t e n ot ot n u l l , numpers number
); CREATE TABLE OPERATION ( n u m c l i number , numccl number , numoper number , numtypeoper number , d a t e o p e r d at at e d e f a u l t s y s d a t e n ot ot n u l l , montantoper nu numb mbe er not nul l , l i b e l o p e r varchar2 ( 3 0 )
); ALTER TABLE CLIENT ADD
( CONSTRAINT p k c l i e n t PRIMARY KEY ( numcli ) , (LENGTH( t e l ) =10 ) CONSTRAINT c k t e l e p h o n e CHECK(LE
); ALTER TABLE PERSONNEL ADD
( ne l PRIMARY KEY (numpers (numpers ) , CONSTRAINT p k p e r s o n ne r e CHECK(SALAIRE >= 1 2 5 4. 4. 2 8 ) CONSTRAINT c k s a l a i re ); ALTER TABLE TYPECCL ADD CONSTRAINT p k t y p e c c l PRIMARY KEY ( n u m t y p e c c l ) ; ALTER TABLE TYPEOPERATION ADD (numtypeoper ) ; CONSTRAINT p k t y p e o p e r a t i o n PRIMARY KEY (numtypeoper ALTER TABLE COMPTECLIENT ADD
( ec l i e n t CONSTRAINT p k c o m p t ec mc ccl) , PRIMARY KEY ( n u m c l i , n u m cl CONSTRAINT f k c c l t y p e c cl FOREIGN KEY ( n u m t y p e c c l ) REFE REFERE RENC NCES ES TYP TYPECCL ( nu mt yp ec cl ) , CONSTRAINT f k c c l c l i e n t FOREIGN KEY ( n u m c l i )
REFE REFERE RENC NCES ES CLIENT CLIENT ( nu mc li ) , CONSTRAINT f k c c l p e r s o n n e l FOREIGN KEY (numpers)
REFE REFERE RENC NCES ES PERS PERSON ONNE NEL L ( nu mp er s ) ); ALTER TABLE OPERATION ADD
(
128
ti o n CONSTRAINT p k o p e r a ti numccl , nu numop moper) er) , PRIMARY KEY ( numcli , numccl CONSTRAINT f k o p e r c c l numo moper) per) FOREIGN KEY ( numcli , nu REFE REFERE RENC NCES ES COMPTECLIENT ( nu mc li , nu mc cl ) , CONSTRAINT f k o p e r c o d e o p e r FOREIGN KEY (numtypeoper)
REFERENCES ty pe op er at io n ( numtypeoper ) , CONSTRAINT m o n t a n t o p e r a t i o n CHECK(montantoper <> 0 AND montantoper >= − 1000 AND montantoper <= 1 0 0 0 )
); INSERT INTO TYPECCL VALUES ( (SELECT nvl (MAX( n u m t yp yp e cc cc l ) , FROM TYPECCL
0) + 1
), ’Comp ’Compte te courant ’ ); INSERT INTO TYPECCL VALUES ( (SELECT nvl (MAX( n u m t yp yp e cc cc l ) , FROM TYPECCL
0) + 1
), ’ livret ’ ); INSERT INTO TYPECCL VALUES ( (SELECT nvl (MAX( n u m t yp yp e cc cc l ) , FROM TYPECCL
0) + 1
), ’PEL’ ); INSERT INTO TYPEOPERATION VALUES ( (SELECT nvl (MAX( n u mt mt yp yp eo eo pe pe r ) , FROM TYPEOPERATION
0) + 1
), ˜ ˜ ´t esp A ˜ ¨ces ’ ); c pA ’dA INSERT INTO TYPEOPERATION VALUES ( (SELECT nvl (MAX( n u mt mt yp yp eo eo pe pe r ) , FROM TYPEOPERATION
0) + 1
), ˜ ˜ c lA¨vement ’ pr A ’ ); INSERT INTO TYPEOPERATION VALUES ( (SELECT nvl (MAX( n u mt mt yp yp eo eo pe pe r ) , FROM TYPEOPERATION
0) + 1
), ’ vireme nt ’ ); INSERT INTO TYPEOPERATION VALUES ( (SELECT nvl (MAX( n u mt mt yp yp eo eo pe pe r ) , FROM TYPEOPERATION
0) + 1
), ’ ret rai t ’ );
129
A.8
Secr´ Sec r´ etari eta riat at p´ edago edagogi giqu que e
DROP TABLE DROP TABLE DROP TABLE DROP TABLE DROP TABLE DROP TABLE
CREATE TABLE ETUDIANT (numEtud number , nom varchar2 ( 4 0 ) , prenom varchar2 ( 4 0 ) , d a t e n a i s s date , c i v i l i t e varchar2 ( 4 ) , patronyme varchar2 ( 4 0 ) , numsecu varchar2 ( 1 5 ) NOT NULL) ; CREATE TABLE MODULE (codMod number , nomMod varchar2 ( 1 5 ) , e f f e c M a x num numbe ber r DEFAULT 3 0 ) ; CREATE TABLE EXAMEN (codMod number , codExam number , dateExam date ) ; CREATE TABLE INSCRIPTION (numEtud number , codMod number , d a t e I n s c d at at e d e f a u l t s y s d a t e ) ; CREATE TABLE PREREQUIS (codMod number , codModPrereq number , noteMin number ( 4 , 2 ) NOT NULL) ; CREATE TABLE RESULTAT (codMod number , codExam number , numEtud number , note number ( 4 , 2 ) ) ; ALTER TABLE ETUDIANT ADD CONSTRAINT p k e t u d i a n t (numEtud d); PRIMARY KEY (numEtu ALTER TABLE MODULE ADD CONSTRAINT pk module (codMod d); PRIMARY KEY (codMo ALTER TABLE EXAMEN ADD CONSTRAINT pk examen (codMod d , codE codExa xam m); PRIMARY KEY (codMo ALTER TABLE PREREQUIS ADD CONSTRAINT p k p r e r e q u i s (codMod d , codModPrereq codModPrereq ) ; PRIMARY KEY (codMo ALTER TABLE INSCRIPTION ADD CONSTRAINT p k i n s c r i p t i o n (codMod d , numE numEtu tud d); PRIMARY KEY (codMo ALTER TABLE RESULTAT ADD CONSTRAINT p k r e s u l t a t (codMod d , numE numEtu tud d , codE codExa xam m); PRIMARY KEY (codMo ALTER TABLE INSCRIPTION ADD (CONSTRAINT f k i n s c r i p t i o n e t u d i a n t FOREIGN KEY (numEtud)
REFERENC ERENCES ES ETUD ETUDIAN IANT( T( numEtu num Etud d) , CONSTRAINT f k i n s c r i p t i o n m o d u l e FOREIGN KEY (codMod)
REFE REFERE RENC NCES ES MODULE( codM od ) ) ; ALTER TABLE PREREQUIS ADD (CONSTRAINT f k p r e r e q u i s c o d m o d FOREIGN KEY (codMod)
REFERENC ERENCES ES MODULE( codMo co dMod d) , er e q CONSTRAINT f k p r e r e q u i s c o d m o d p r er FOREIGN KEY (codModPrereq) REFE REFERE RENC NCES ES MODULE( codM od ) ) ; ALTER TABLE EXAMEN ADD CONSTRAINT f k e x a m e n FOREIGN KEY (codMod)
REFERENC ERENCES ES MODULE( codMo co dMod d); ALTER TABLE RESULTAT ADD (CONSTRAINT f k r e s u l t a t e x a m e n (codMod, codExa codExam) m) FOREIGN KEY (codMod,
REFE REFERE RENC NCES ES EX EXAMEN( codMod codM od , codE xam ) , CONSTRAINT f k r e s u l t a t i n s c r i p t i o n (codMod, numE numEtud) tud) FOREIGN KEY (codMod,
ALTER TABLE ETUDIANT ADD (CONSTRAINT c k c i v i l i t e CHECK
( c i v i l i t e IN ( ’Mr’ ’Mr’ , ’Mm ’Mme’ , ’ Mlle ’ ) ), CONSTRAINT c k c i v i l i t e n u m s e c u CHECK
( um se se cu cu , SUBSTR( n um
1 , 1 ) = ’ 2 ’ OR patronyme patronyme IS NULL
), CONSTRAINT c k l e n g t h n u m s e c u CHECK
( l e n g t h ( n u ms ms ec ec u ) = 1 5 ), CONSTRAINT c k a n n e e n u m s e c u CHECK ( t o c h a r ( d a t e n a i s s , ’ y y ’ ) = substr ( n u ms ms ec ec u , 2 , 2 ) ) );
131
A.9 A.9
Mari Maria ages ges
CREATE TABLE PERSONNE (numpers nu numb mber er PRIMARY KEY, nom varchar2 ( 3 0 ) NOT NULL, prenom varchar2 ( 3 0 ) ,
p e r e REF REFEREN ERENC CES PERS PERSONNE( num pe rs ) , me re REFE REFERE RENC NCES ES PER PERSO SONN NNE( nu mp er s ) ); CREATE TABLE MARIAGE
( nummari NUMBER REFE REFERE RENC NCES ES PERS PERSON ONNE( NE( nu mp er s ) , numfemme NUMBER REFE REFERE RENC NCES ES PERS PERSON ONNE( NE( nu mp er s ) , d a t e m a r i a g e DATE DEFAULT SYSDATE, d a t e d i v o r c e DATE DEFAULT NULL, (nummarii , numf numfem emme, me, date Maria ge ) PRIMARY KEY(nummar );