Number Number Number: Exercice 1

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 21

3.10 Introduction au PL/SQL Exercice 1 DECLARE a NUMBER; b NUMBER; t NUMBER; BEGIN a := 1 ; b := 2 ; DBMSOUTPUT.PUT LINE( ' a = ' j j a ) ; DBMSOUTPUT.

.PUT LINE( 'b = ' j j b ) ; DBMSOUTPUT.PUT LINE( ' Let ' ' s swap a and b . . . The r e s u l t i s : ' ) ; t := a ; a := b ; b := t ; DBMSOUTPUT.PUT LINE( ' a = ' j j a ) ; DBMSOUTPUT.PUT LINE( 'b = ' j j b ) ; END; / Exercice 2 DECLARE a NUMBER; r e s NUMBER; count e r NUMBER; BEGIN a := 1 0 ; r e s := 1 ; count e r := a ; WHILE count e r > 0 LOOP r e s := r e s _ count e r ; count e r := count e r 1 ; END LOOP; DBMSOUTPUT.PUT LINE( a j j ' != ' j j r e s ) ; END; / Exercice 3 DECLARE a NUMBER := 4 8 ; b NUMBER := 8 4 ; amodb NUMBER; BEGIN DBMSOUTPUT.PUT( 'PGCD( ' j j a j j ' , ' j j b j j ' ) = ' ) ; WHILE b > 0 LOOP amodb := a ; WHILE amodb >= b LOOP amodb := amodb b ; END LOOP; a := b ; b := amodb ; END LOOP;

DBMSOUTPUT.PUT LINE( a ) ; END; / 92 3.11 Tableaux et Structures SET SERVEROUTPUT ON Tableaux DECLARE TYPE montab IS VARRAY (50) OF INTEGER; t montab ; BEGIN t := montab ( ) ; t . extend ( 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 ; END LOOP; Inver s ion de l ' ordre des _el_ements DECLARE temp integer ; BEGIN FOR i IN 1 . . 1 0 LOOP temp := t ( i ) ; t ( i ) := t (20i +1); t (20i+1) := temp ; END LOOP; END; Af f ichage FOR i IN 1 . . 2 0 LOOP DBMSOUTPUT.PUT LINE( ' t ( ' j j ijj')='jjt(i)); END LOOP; Tri _a b u l l e DECLARE temp integer ; BEGIN FOR i IN REVERSE 2 . . 2 0 LOOP FOR j IN 2 . . i LOOP IF t ( j 1) > t ( j ) THEN temp := t ( j ) ; t ( j ) := t ( j 1); t ( j 1) := temp ; END IF ; END LOOP; END LOOP; END; Af f ichage FOR i IN 1 . . 2 0 LOOP DBMSOUTPUT.PUT LINE( ' t ( ' j j ijj')='jjt(i));

END LOOP; Recherche par dichotomie de l ' _el_ement 225 DECLARE i n f INTEGER := 1 ; sup INTEGER := 2 0 ; m INTEGER; X INTEGER := 400; BEGIN LOOP DBMSOUTPUT.PUT LINE( ' i n f = ' j j i n f j j ' ; sup = ' j j sup ) ; m := ( i n f + sup ) / 2 ; EXIT WHEN t (m) = X OR i n f = sup ; IF t (m) > X THEN sup := m1; ELSE i n f := m+1; END IF ; END LOOP; IF t (m) = X THEN DBMSOUTPUT.PUT LINE(X j j ' e s t dans l e tabl eau ' ) ; ELSE DBMSOUTPUT.PUT LINE(X j j ' n" e s t pas dans l e tabl eau ' ) ; END IF ; END; END; / 93 St ruc tur e s DECLARE Mai l lon d ' une l i s t e cha^_n_ee TYPE CELL IS RECORD ( Donn_ee de chaque mai l lon data INTEGER, Indice du mai l lon pr_ec_edent de l a l i s t e , 1 s ' i l n ' y en a pas pr evi ous INTEGER, Indice du mai l lon suivant de l a l i s t e , 1 s ' i l n ' y en a pas next INTEGER ); Type tab l eau contenant l e s mai l lons de l a l i s t e TYPE TREE IS VARRAY (19) OF CELL; Tableau contenant l e s mai l lons de l a l i s t e t TREE; indi c e du premier _el_ement de l a l i s t e

f i r s t integer ; indi c e du dernier _el_ement de l a l i s t e las t integer ; BEGIN t := TREE( ) ; t . extend ( 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 ) . data := power ( i , 5) mod 19 ; t ( i ) . pr evi ous := i 1; t ( i ) . next := i +1; END LOOP; f i r s t := 1 ; las t := 1 9 ; t ( f i r s t ) . pr evi ous := 1; t ( las t ) . next := 1; Af f ichage DECLARE p integer := f i r s t ; BEGIN WHILE p <> 1 LOOP DBMSOUTPUT.PUT LINE( ' ( ' j j p j j ' , ' j j t (p ) . data j j ' , ' j j t (p ) . pr evi ous j j ' , ' j j t (p ) . next j j ' ) ' ) ; p := t (p ) . next ; END LOOP; END; Inver s ion de l ' ordre des _el_ements DECLARE temp INTEGER; BEGIN FOR i IN 1 . . 1 9 LOOP temp := t ( i ) . pr evi ous ; t ( i ) . pr evi ous := t ( i ) . next ; t ( i ) . next := temp ; END LOOP; f i r s t := 1 9 ; las t := 1 ; END; Af f ichage DECLARE p integer := f i r s t ; BEGIN WHILE p <> 1 LOOP DBMSOUTPUT.PUT LINE( ' ( ' j j pjj','jj t (p ) . data j j ' , ' j j t (p ) . pr evi ous j j ' , ' j j t (p ) . next j j ' ) ' ) ;

p := t (p ) . next ; END LOOP; END; Tri _a b u l l e DECLARE i integer := las t ; j integer ; BEGIN WHILE t ( t ( i ) . pr evi ous ) . pr evi ous <> 1 LOOP j := f i r s t ; WHILE i<>j LOOP IF ( t ( j ) . data > t ( t ( j ) . next ) . data ) THEN 94 Echange de j e t t ( j ) . next par modi f icat ion du cha^_nage DECLARE a f t e r J INTEGER := t ( j ) . next ; be f o r e J INTEGER := t ( j ) . pr evi ous ; BEGIN t ( j ) . next := t ( a f t e r J ) . next ; t ( a f t e r J ) . next := j ; t ( a f t e r J ) . pr evi ous := be f o r e J ; t ( j ) . pr evi ous := a f t e r J ; IF t ( j ) . next <> 1 THEN t ( t ( j ) . next ) . pr evi ous := j ; ELSE las t := j ; END IF ; IF t ( a f t e r J ) . pr evi ous <> 1 THEN t ( t ( a f t e r J ) . pr evi ous ) . next := a f t e r J ; ELSE f i r s t := a f t e r J ; END IF ; IF a f t e r J = i THEN i := j ; END IF ; END; ELSE j := t ( j ) . next ; END IF ; END LOOP; i := t ( i ) . pr evi ous ; END LOOP; END; Af f ichage DECLARE p integer := f i r s t ; BEGIN WHILE p <> 1 LOOP DBMSOUTPUT.PUT LINE( ' ( ' j j p j j ' , ' j j

t (p ) . data j j ' , ' j j t (p ) . pr evi ous j j ' , ' j j t (p ) . next j j ' ) ' ) ; p := t (p ) . next ; END LOOP; END; END; / 95 3.12 Application du PL/SQL et Exceptions SET SERVEROUTPUT ON SET AUTOCOMMIT OFF Exercice 1 DECLARE unCl i ent PERSONNE%ROWTYPE; numCl ient PERSONNE. numpers%type ; Y A EU UNE MERDE EXCEPTION; BEGIN FOR numCl ient IN 1 . . 2 1 LOOP BEGIN SELECT _ INTO unCl i ent FROM PERSONNE WHERE numpers = numCl ient ; INSERT INTO CLIENT ( numcl i , nomcl i , pr enomc l i ) VALUES ( unCl i ent . numpers , unCl i ent . nom, unCl i ent . prenom ) ; EXCEPTION WHEN NO DATA FOUND THEN DBMSOUTPUT.PUT LINE( ' Personne n"a l " i d e n t i f i a n t ' j j numCl ient ) ; WHEN TOOMANYROWS THEN DBMSOUTPUT.PUT LINE( ' Cet te message ne de v r a i t jamai s appa r a^_ t r e ! ' ) ; WHEN DUP VAL ON INDEX THEN DBMSOUTPUT.PUT LINE( ' Cont raint e de c l _e v i o l _e e ! Message SQL : ' j j SQLERRM) ; WHEN OTHERS THEN RAISE Y A EU UNE MERDE; END; END LOOP; COMMIT; EXCEPTION WHEN Y A EU UNE MERDE THEN DBMSOUTPUT.PUT LINE( 'SQLCODE = ' j j SQLCODE) ; DBMSOUTPUT.PUT LINE( ' I l y a eu une Merde ! ' ) ; ROLLBACK;

END; / Exercice 2 DECLARE unCl i ent CLIENT%rowtype ; BEGIN SELECT _ INTO unCl i ent FROM CLIENT WHERE numCli = ( SELECTMAX( numcl i ) FROM CLIENT ); INSERT INTO PERSONNEL VALUES ( 1, unCl i ent . nomcl i , unCl i ent . prenomcl i , NULL, 1254.28 ); COMMIT; EXCEPTION WHEN NO DATA FOUND THEN DBMSOUTPUT.PUT LINE( 'Aucun c l i e n t ' ) ; WHEN DUP VAL ON INDEX THEN DBMSOUTPUT.PUT LINE( ' I l y a un gros probl_eme . . . J"comprends pas c " qui s " pas s e ' ) ; END; / Exercice 3 DECLARE numCl ient CLIENT. numcl i%TYPE; tCCL TYPECCL. numtypeccl%TYPE; nto TYPEOPERATION. numtypeoper%TYPE; Y A UN GRO BLEME EXCEPTION; BEGIN SELECT numtypeoper INTO nto 96 FROM TYPEOPERATION WHERE nomtypeoper = ' d_ep^ot e sp_e c e s ' ; SELECT numtypeccl INTO tCCL FROM TYPECCL WHERE nomtypeCCL = 'Compte courant ' ; FOR numCl ient IN 1 . . 2 1 LOOP BEGIN INSERT INTO COMPTECLIENT VALUES ( numClient , 1, tCCL,

SYSDATE, 1 ); INSERT INTO OPERATION VALUES ( numClient , 1, 1, nto , SYSDATE, numCl ient _ 100 , ' inaugur a t i on du compte ' ); COMMIT; EXCEPTION WHEN OTHERS THEN Adaptez l e num_ero du code , chez moi _ca donne 2290 IF SQLCODE = 2290 THEN DECLARE t o t a l OPERATION. montantoper%TYPE := numCl ient _ 100; t o I n s e r t OPERATION. montantoper%TYPE; cpt NUMBER := 1 ; BEGIN WHILE t o t a l > 0 LOOP IF t o t a l > 1000 THEN t o I n s e r t := 1000; 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( numoper ) , 0) + 1 FROM OPERATION WHERE numcl i = numCl ient AND numccl = 1 ), nto , SYSDATE, t o Ins e r t , ' Inaugurat ion du compte ' j j cpt ); t o t a l := t o t a l t o I n s e r t ; cpt := cpt + 1 ; END LOOP; EXCEPTION WHEN OTHERS THEN DBMSOUTPUT.PUT LINE( 'MOD( t o t a l , 1000) = ' j j MOD( t o t a l , 1 0 0 0 ) ) ;

DBMSOUTPUT.PUT LINE( 'SQLCODE = ' j j SQLCODE) ; DBMSOUTPUT.PUT LINE( 'SQLERRM = ' j j SQLERRM) ; RAISE Y A UN GRO BLEME; END; ELSE DBMSOUTPUT.PUT LINE( 'SQLCODE = ' j j SQLCODE) ; DBMSOUTPUT.PUT LINE( 'SQLERRM = ' j j SQLERRM) ; ROLLBACK; END IF ; END; END LOOP; EXCEPTION WHEN NO DATA FOUND THEN DBMSOUTPUT.PUT LINE( 'Pas de donn_ees ! ' ) ; WHEN TOOMANYROWS THEN DBMSOUTPUT.PUT LINE( 'Trop de donn_ees ! ' ) ; WHEN Y A UN GRO BLEME THEN DBMSOUTPUT.PUT LINE( ' I l y a un gros probl_eme ! ' ) ; DBMSOUTPUT.PUT LINE( 'SQLCODE = ' j j SQLCODE) ; DBMSOUTPUT.PUT LINE( 'SQLERRM = ' j j SQLERRM) ; WHEN OTHERS THEN DBMSOUTPUT.PUT LINE( 'SQLCODE = ' j j SQLCODE) ; DBMSOUTPUT.PUT LINE( 'SQLERRM = ' j j SQLERRM) ; END; / Exercice 4 97 DECLARE numCl ient CLIENT. numcl i%TYPE := 2 ; numCompteLivret TYPECCL. numtypeCCL%TYPE; nto TYPEOPERATION. numtypeoper%TYPE; montant OPERATION. montantoper%TYPE; Y A UN GRO BLEME EXCEPTION; BEGIN SELECT numtypeoper INTO nto FROM TYPEOPERATION WHERE nomtypeoper = ' vi rement ' ; SELECT numtypeccl INTO numCompteLivret FROM TYPECCL WHERE nomtypeCcl = ' l i v r e t ' ; WHILE numCl ient <= 21 LOOP BEGIN montant := 100 _ numCl ient 500; INSERT INTO COMPTECLIENT VALUES ( numClient , 2, numCompteLivret , SYSDATE, 1

); INSERT INTO OPERATION VALUES ( numClient , 1, (SELECT nvl (MAX( numoper ) , 0) + 1 FROM OPERATION WHERE numcl i = numCl ient AND numccl = 1 ) , nto , SYSDATE, montant , ' versement l i v r e t ' ); INSERT INTO OPERATION VALUES ( numClient , 2, (SELECT nvl (MAX( numoper ) , 0) + 1 FROM OPERATION WHERE numcl i = numCl ient AND numccl = 2 ) , nto , SYSDATE, montant , ' versement l i v r e t ' ); COMMIT; EXCEPTION WHEN OTHERS THEN idem IF SQLCODE = 2290 THEN DECLARE t o t a l OPERATION. montantoper%TYPE := montant ; toMove OPERATION. montantoper%TYPE; cpt NUMBER := 1 ; BEGIN WHILE t o t a l > 1000 LOOP IF t o t a l > 1000 THEN toMove := 1000; ELSE tomove := t o t a l ; END IF ; INSERT INTO OPERATION VALUES ( numClient , 1, (SELECT nvl (MAX( numoper ) , 0) + 1 FROM OPERATION WHERE numcl i = numCl ient

AND numccl = 1) , nto , SYSDATE, toMove , ' versement l i v r e t ' j j cpt ); INSERT INTO OPERATION VALUES ( numClient , 2, (SELECT nvl (MAX( numoper ) , 0) + 1 FROM OPERATION WHERE numcl i = numCl ient AND numccl = 2) , nto , 98 SYSDATE, toMove , ' versement l i v r e t ' j j cpt ); t o t a l := t o t a l toMove ; cpt := cpt + 1 ; END LOOP; COMMIT; EXCEPTION WHEN OTHERS THEN RAISE Y A UN GRO BLEME; END; ELSE DBMSOUTPUT.PUT LINE( 'SQLCODE = ' j j SQLCODE) ; DBMSOUTPUT.PUT LINE( 'SQLERRM = ' j j SQLERRM) ; ROLLBACK; END IF ; END; COMMIT; numCl ient := numCl ient + 2 ; END LOOP; EXCEPTION WHEN NO DATA FOUND THEN DBMSOUTPUT.PUT LINE( 'Pas de donn_ees ! ' ) ; WHEN TOOMANYROWS THEN DBMSOUTPUT.PUT LINE( 'Trop de donn_ees ! ' ) ; WHEN Y A UN GRO BLEME THEN DBMSOUTPUT.PUT LINE( ' I l y a un gros probl_eme ! ' ) ; DBMSOUTPUT.PUT LINE( 'SQLCODE = ' j j SQLCODE) ; DBMSOUTPUT.PUT LINE( 'SQLERRM = ' j j SQLERRM) ; WHEN OTHERS THEN DBMSOUTPUT.PUT LINE( 'SQLCODE = ' j j SQLCODE) ; DBMSOUTPUT.PUT LINE( 'SQLERRM = ' j j SQLERRM) ; END;

/ 99 3.13 Sous-programmes Exercice 1 CREATE OR REPLACE FUNCTION bad pui s sanc e (b NUMBER, n NUMBER) RETURN NUMBER IS BEGIN IF (n = 0) THEN RETURN 1 ; ELSE RETURN b _ bad pui s sanc e (b , n 1 ) ; END IF ; END; / Exercice 2 CREATE OR REPLACE FUNCTION good pui s sanc e (b NUMBER, n NUMBER) RETURN NUMBER IS BEGIN IF (n = 0) THEN RETURN 1 ; END IF ; IF ( MOD(n , 2) = 0 ) THEN RETURN good pui s sanc e (b _ b , n / 2 ) ; END IF ; RETURN b _ good pui s sanc e (b , n 1 ) ; END; / Exercice 3 CREATE OR REPLACE FUNCTION demiFreres (A PERSONNE. numpers%type , B PERSONNE. numpers%type ) RETURN BOOLEAN IS rowA PERSONNE%rowtype ; rowB PERSONNE%rowtype ; BEGIN SELECT _ INTO rowA FROM PERSONNEWHERE numpers = A; SELECT _ INTO rowB FROM PERSONNEWHERE numpers = B; RETURN rowA. pe r e = rowB . pe r e OR rowA. mere = rowB . mere ; END; / Exercice 4 CREATE OR REPLACE FUNCTION f r e r e s (A PERSONNE. numpers%type , B PERSONNE. numpers%type ) RETURN BOOLEAN IS rowA PERSONNE%rowtype ; rowB PERSONNE%rowtype ; BEGIN SELECT _ INTO rowA FROM PERSONNEWHERE numpers = A; SELECT _ INTO rowB FROM PERSONNEWHERE numpers = B;

RETURN rowA. pe r e = rowB . pe r e AND rowA. mere = rowB . mere ; END; / CREATE OR REPLACE FUNCTION cous insGermains (A PERSONNE. numpers%type , B PERSONNE. numpers%type ) RETURN BOOLEAN IS rowA PERSONNE%rowtype ; rowB PERSONNE%rowtype ; BEGIN SELECT _ INTO rowA FROM PERSONNEWHERE numpers = A; SELECT _ INTO rowB FROM PERSONNEWHERE numpers = B; RETURN f r e r e s ( rowA. pere , rowB . pe r e ) OR f r e r e s ( rowA. pere , rowB . mere ) OR f r e r e s ( rowA. mere , rowB . pe r e ) OR f r e r e s ( rowA. mere , rowB . mere ) ; END; / Exercice 5 CREATE OR REPLACE PROCEDURE a i e u l (P PERSONNE. numpers%type ) IS row PERSONNE%rowtype ; nb NUMBER; BEGIN SELECT count (_) INTO NB FROM PERSONNE 100 WHERE numpers = P; IF (NB = 1) THEN SELECT _ INTO row FROM PERSONNE WHERE numpers = P; DBMSOUTPUT.PUT LINE( row . nom) ; a i e u l ( row . pe r e ) ; END IF ; END; / Exercice 6 CREATE OR REPLACE PROCEDURE mecs (P PERSONNE. numpers%type ) IS row PERSONNE%rowtype ; nb NUMBER; BEGIN SELECT count (_) INTO NB FROM PERSONNE WHERE numpers = P; IF (NB = 1) THEN

SELECT _ INTO row FROM PERSONNE WHERE numpers = P; SELECT count (_) INTO NB FROM PERSONNE WHERE pe r e = P; IF (NB > 0) THEN DBMSOUTPUT.PUT LINE( row . nom) ; END IF ; mecs ( row . pe r e ) ; mecs ( row . mere ) ; END IF ; END; / Exercice 7 CREATE OR REPLACE FUNCTION ascendant (A PERSONNE. numpers%type , B PERSONNE. numpers%type ) RETURN BOOLEAN IS row PERSONNE%rowtype ; BEGIN SELECT _ INTO row FROM PERSONNEWHERE numpers = B; IF ( row . pe r e = A OR row . mere = A) THEN RETURN TRUE; END IF ; RETURN ( row . pe r e IS NOT NULL AND ascendant (A, row . pe r e ) ) OR ( row . mere IS NOT NULL AND ascendant (A, row . mere ) ) ; END; / BEGIN IF ( ascendant ( 1 , 8 ) ) THEN DBMSOUTPUT.PUT LINE( 'OK' ) ; ELSE DBMSOUTPUT.PUT LINE( ' pas OK' ) ; END IF ; END; / Exercice 8 CREATE OR REPLACE FUNCTION fmax (A NUMBER, B NUMBER) RETURN NUMBER IS BEGIN IF (A > B) THEN RETURN A; ELSE RETURN B; END IF ; END; / CREATE OR REPLACE FUNCTION

ecar tAscendant (A PERSONNE. numpers%type , B PERSONNE. numpers%type ) RETURN NUMBER IS row PERSONNE%rowtype ; NB NUMBER; BEGIN SELECT _ INTO row FROM PERSONNEWHERE numpers = B; IF ( row . pe r e = A OR row . mere = A) THEN RETURN 1 ; END IF ; IF ( row . pe r e IS NULL) THEN 101 NB := 1; ELSE NB := ecar tAscendant (A, row . pe r e ) ; END IF ; IF ( row . mere IS NULL) THEN NB := fmax(1 , NB) ; ELSE NB := fmax ( ecar tAscendant (A, row . pe r e ) , NB) ; END IF ; IF (NB <> 1) THEN NB := NB + 1 ; END IF ; RETURN NB; END; / CREATE OR REPLACE FUNCTION e c a r t (A PERSONNE. numpers%type , B PERSONNE. numpers%type ) RETURN NUMBER IS row PERSONNE%rowtype ; NB NUMBER; BEGIN RETURN fmax ( ecar tAscendant (A, B) , ecar tAscendant (B, A) ) ; END; / Exercice 9 SELECT A. nom, A. prenom , B. nom, B. prenom FROM PERSONNE A, PERSONNE B WHERE ecar tAscendant (A. numpers , B. numpers ) = ( SELECTMAX( ec ) FROM ( SELECT e c a r t (A. numpers , B. numpers ) AS ec FROM PERSONNE A, PERSONNE B ) ); Exercice 10 102 3.14 Curseurs

CREATE OR REPLACE PROCEDURE copyFromPersonneToCl ient IS CURSOR C IS SELECT _ FROM PERSONNE; ROW C%rowtype ; BEGIN FOR ROW IN C LOOP INSERT INTO CLIENT ( numcl i , nomcl i , pr enomc l i ) VALUES (ROW. numpers , ROW. nom, ROW. prenom ) ; END LOOP; COMMIT; EXCEPTION WHEN DUP VAL ON INDEX THEN DBMSOUTPUT.PUT LINE( 'Copy can be done only once . ' ) ; END; / CALL copyFromPersonneToCl ient ( ) ; CREATE OR REPLACE PROCEDURE takeCl i entToPe r sonne l IS Row c l i e n t%rowtype ; BEGIN SELECT _ INTO Row FROM CLIENT WHERE numcl i = ( SELECTMAX( numcl i ) FROM CLIENT) ; INSERT INTO PERSONNEL ( numpers , nompers , prenompers ) VALUES (Row. numcl i , Row. nomcl i , Row. pr enomc l i ) ; COMMIT; EXCEPTION WHEN DUP VAL ON INDEX THEN DBMSOUTPUT.PUT LINE( ' This row has al r eady been imported . ' ) ; ROLLBACK; WHEN NO DATA FOUND THEN DBMSOUTPUT.PUT LINE( ' Table CLIENT i s empty . ' ) ; ROLLBACK; END; / CALL takeCl i entToPe r sonne l ( ) ; CREATE OR REPLACE PROCEDURE c r edi tAc count ( numcl ient CLIENT. numcl i%type , value NUMBER) IS BEGIN IF ( value > 100) THEN c r edi tAc count ( numcl ient , 1 0 0 ) ; c r edi tAc count ( numcl ient , value 1 0 0 ) ; ELSE

INSERT INTO OPERATION VALUES ( numcl ient , 1, (SELECT nvl (MAX( numoper ) , 0) + 1 FROM OPERATION WHERE numcl i = numcl ient AND numccl = 1 ), (SELECT numtypeoper FROM TYPEOPERATION WHERE nomtypeoper = ' vi rement ' ), sysdate , value , ' cadeau ! ' ); END IF ; EXCEPTION WHEN OTHERS THEN IF (SQLCODE = 22900) THEN DBMSOUTPUT.PUT LINE( 'Too much money at once . ' ) ; END IF ; END; / CREATE OR REPLACE PROCEDURE c r eat eVi r ement ( numcl ient CLIENT. numcl i%type , value NUMBER) IS BEGIN INSERT INTO OPERATION VALUES ( numcl ient , 1, (SELECT nvl (MAX( numoper ) , 0) + 1 103 FROM OPERATION WHERE numcl i = numcl ient AND numccl = 1 ), (SELECT numtypeoper FROM TYPEOPERATION WHERE nomtypeoper = ' vi rement ' ), sysdate , value , ' cadeau ! ' ); INSERT INTO OPERATION VALUES ( numcl ient , 2, (SELECT nvl (MAX( numoper ) , 0) + 1 FROM OPERATION WHERE numcl i = numcl ient

AND numccl = 1 ), (SELECT numtypeoper FROM TYPEOPERATION WHERE nomtypeoper = ' vi rement ' ), sysdate , value , ' cadeau ! ' ); EXCEPTION WHEN OTHERS THEN IF (SQLCODE = 22900) THEN DBMSOUTPUT.PUT LINE( 'Too much money at once . ' ) ; END IF ; END; / CREATE OR REPLACE PROCEDURE moveToLivret ( numcl ient CLIENT. numcl i%type , value NUMBER) IS BEGIN IF ( value >= 0) THEN IF ( value > 100) THEN moveToLivret ( numcl ient , 1 0 0 ) ; moveToLivret ( numcl ient , value 1 0 0 ) ; ELSE c r eat eVi r ement ( numcl ient , value ) ; END IF ; END IF ; EXCEPTION WHEN OTHERS THEN IF (SQLCODE = 22900) THEN DBMSOUTPUT.PUT LINE( 'Too much money at once . ' ) ; END IF ; END; / CREATE OR REPLACE PROCEDURE openAccount ( numcl ient CLIENT. numcl i%type ) IS BEGIN INSERT INTO COMPTECLIENT VALUES ( numcl ient , 1, (SELECT numtypeccl FROM TYPECCL WHERE nomtypeccl = 'Compte courant ' ), sysdate , (SELECT numpers FROM PERSONNEL WHERE numpers = (

SELECTMAX( numcl i ) FROM CLIENT ) ) ); INSERT INTO COMPTECLIENT VALUES ( numcl ient , 2, (SELECT numtypeccl FROM TYPECCL WHERE nomtypeccl = ' vi rement ' ), sysdate , (SELECT numpers FROM PERSONNEL WHERE numpers = ( SELECTMAX( numcl i ) FROM CLIENT 104 ) ) ); c r edi tAc count ( numcl ient , numcl ient _ 1 0 0 ) ; moveToLivret ( numcl ient , numcl ient _ 100 5 0 0 ) ; EXCEPTION WHEN DUP VAL ON INDEX THEN DBMSOUTPUT.PUT LINE( ' This account has al r eady been opened . ' ) ; END; / CREATE OR REPLACE PROCEDURE openAccounts IS CURSOR C IS SELECT numcl i FROM CLIENT; ROW C%rowtype ; BEGIN FOR ROW IN C LOOP openAccount (ROW. numcl i ) ; END LOOP; COMMIT; EXCEPTION WHEN OTHERS THEN DBMSOUTPUT.PUT LINE( 'An e r r o r has oc cur r ed . ' ) ; ROLLBACK; END; / CALL openAccounts ( ) ; CREATE OR REPLACE PROCEDURE a f f i cheDe s c endanc e ( numpersonne NUMBER) IS CURSOR C IS SELECT _

FROM PERSONNE WHERE pe r e = numpersonne OR mere = numpersonne ; ROW C%rowType ; BEGIN FOR ROW IN C LOOP DBMSOUTPUT.PUT LINE( row . nomj j ' ' j j row . prenom ) ; a f f i cheDe s c endanc e (ROW. numpers ) ; END LOOP; END; / 105 3.15 Curseurs param_etr_es Exercice 1 CREATE OR REPLACE PROCEDURE a f f i c h eCl i e n t ( unCl i ent CLIENT%rowtype ) IS BEGIN DBMSOUTPUT.PUT LINE( ' Cl i ent ' j j unCl i ent . pr enomc l i j j ' ' j j unCl i ent . nomCli ) ; END; / CREATE OR REPLACE PROCEDURE af f icheCompte (unCompte COMPTECLIENT%rowtype ) IS BEGIN DBMSOUTPUT.PUT LINE( ' _ Compte ' j j unCompte . numCli j j '' j j unCompte . numccl ) ; END; / CREATE OR REPLACE PROCEDURE a f f i cheCompt e sCl i ent s IS CURSOR c l i e n t s IS SELECT _ FROM CLIENT; unCl i ent c l i e n t s%rowtype ; CURSOR comptes ( numcl ient CLIENT. numcl i%type ) IS SELECT _ FROM COMPTECLIENT WHERE numcl i = numcl ient ; unCompte c l i e n t s%rowtype ; BEGIN FOR unCl i ent IN c l i e n t s LOOP a f f i c h eCl i e n t ( unCl i ent ) ; FOR unCompte IN comptes ( unCl i ent . numcl i ) LOOP af f icheCompte (unCompte ) ; END LOOP; END LOOP; END; / SET SERVEROUTPUT ON SIZE 1000000 c a l l a f f i cheCompt e sCl i ent s ( ) ; Exercice 2

CREATE OR REPLACE PROCEDURE a f f i c h eOp e r a t i on ( uneOperation OPERATION%rowtype ) IS BEGIN DBMSOUTPUT.PUT LINE( ' _ _ Operat ion ' j j uneOperation . numOper j j ' , montant : ' j j uneOperation . montantOper ) END; / CREATE OR REPLACE PROCEDURE af f i cheOpe rCompt e sCl i ent s IS CURSOR c l i e n t s IS SELECT _ FROM CLIENT; unCl i ent c l i e n t s%rowtype ; CURSOR comptes ( numcl ient CLIENT. numcl i%type ) IS SELECT _ FROM COMPTECLIENT WHERE numcl i = numcl ient ; unCompte c l i e n t s%rowtype ; CURSOR ope r a t i ons ( numcl ient CLIENT. numcl i%type , numcompte COMPTECLIENT. numccl%type ) IS SELECT _ FROM OPERATION WHERE numcl i = numcl ient AND numccl = numcompte ; uneOperation ope r a t i ons%rowtype ; BEGIN FOR unCl i ent IN c l i e n t s LOOP a f f i c h eCl i e n t ( unCl i ent ) ; FOR unCompte IN comptes ( unCl i ent . numcl i ) LOOP af f icheCompte (unCompte ) ; FOR uneOperation IN ope r a t i ons ( unCl i ent . numcl i , unCompte . numccl ) LOOP a f f i c h eOp e r a t i o n ( uneOperation ) ; END LOOP; END LOOP; END LOOP; END; / c a l l af f i cheOpe rCompt e sCl i ent s ( ) ; 106

You might also like