0% found this document useful (0 votes)
79 views21 pages

Number Number Number: Exercice 1

This document contains examples of PL/SQL code for working with arrays, structures, and exceptions. It includes code to initialize and manipulate arrays and linked lists, as well as code showing how to handle exceptions when inserting data into database tables.

Uploaded by

Yousra Boussetta
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
79 views21 pages

Number Number Number: Exercice 1

This document contains examples of PL/SQL code for working with arrays, structures, and exceptions. It includes code to initialize and manipulate arrays and linked lists, as well as code showing how to handle exceptions when inserting data into database tables.

Uploaded by

Yousra Boussetta
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 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