42
1 PL/SQL Noreddine GHERABI

1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

Embed Size (px)

Citation preview

Page 1: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

1

PLSQL

Noreddine GHERABI

2

Introduction

Pourquoi PLSQL 1048713 SQL est un langage non proceacutedural1048713 Les traitements complexes sont parfois difficiles agrave eacutecrire si on ne peut utiliser des variables et les structures de programmation comme les boucles et les alternativesUtilisation de PLSQL1048713 PLSQL peut ecirctre utiliseacute pour lrsquoeacutecriture des proceacutedures stockeacutees et des triggers (Oracle accepte aussi le langage Java)1048713 Il convient aussi pour eacutecrire des fonctions utilisateurs qui peuvent ecirctre utiliseacutees dans les requecirctes SQL (en plus des fonctions preacutedeacutefinies)1048713 Il est aussi utiliseacute dans des outils Oracle Forms et Report en particulier

1048713 PLSQL est un langage proprieacutetaire de Oracle

3

Structure drsquoun programme

Un programme est structureacute en blocs drsquoinstructions de 3 types bull proceacutedures anonymesbull proceacutedures nommeacuteesbull fonctions nommeacutees DECLARE -- deacutefinitions de variables BEGIN -- Les instructions agrave exeacutecuter EXCEPTION -- La reacutecupeacuteration des erreurs END

4

Variables

1048713 Identificateurs Oracle

30 caractegraveres au plus

Commence par une lettre

Peut contenir lettres chiffres _ $ et

Pas sensible agrave la casse

1048713 Types de variables

bull Les types habituels correspondants aux types SQL2 Oracle integer varcharhellip

bull Types composites adapteacutes agrave la reacutecupeacuteration des colonnes et lignes des tables SQL TYPE ROWTYPE

5

Variables

1048713 Deacuteclaration drsquoune variable identificateur [CONSTANT] type [= valeur]Exemples bull age integer=20bull nom varchar(30) bull dateNaissance datebull ok boolean = truebull PI CONSTANT REAL=500 Deacuteclarations multiples interdites On peut deacuteclarer qursquoune variable est du mecircme type qursquoune colonne

drsquoune table (ou qursquoune autre variable) bull NC clientnomTYPEbull Age numberbull Age1 agetype

6

Variables

1048713 Une variable peut contenir toutes les colonnes drsquoune ligne drsquoune table

bull employe empROWTYPE

bull deacuteclare que la variable employe contiendra une ligne de la table emp

bull Exemple drsquoutilisation

employe empROWTYPE

nom empnomeTYPE

select INTO employe from emp where matr = 900

nom = employenome

employedept = 20

hellip

insert into emp values employe

7

Opeacuterateurs

bull Arithmeacutetique+ -

bull Concateacutenation||

bull Parenthegravese pour controcircler les prioriteacutes des opeacuterations( )

bull Affectation=

bull Comparaison= ltgt lt gt lt= gt= IS NULL LIKE BETWEEN IN

bull LogiqueAND OR NOT

bull Conversion de types

8

Conversions de types de donneacutees

bull Les meacutelanges de types ndash provoquent des erreurs

ndash affectent les performances

bull Fonctions de conversion ndash TO_CHAR

ndash TO_DATE

ndash TO_NUMBER

bull Exemple V = USER || lsquo rsquo || DATE -- Types incompatibles V = USER || lsquo rsquo || TO_CHAR(SYSDATE) -- ok

9

Blocks imbriqueacutes et porteacutee des variables (Exemple)

DECLAREpoids_v NUMBER(3) = 600

message_v VARCHAR2(255) = lsquoProduit 10012rsquo

BEGIN

DECLAREpoids_v NUMBER(3) = 1 message_v VARCHAR2(255) = lsquoProduit 11001rsquo

pays_v VARCHAR2(50) = lsquoEuropersquo

BEGIN

poids_v = poids_v +1

pays_v = lsquoOuest- rsquo || pays_v

END

poids_v = poids_v +1

message_v = mesage_v || lsquo est en stockrsquo

pays_v = lsquoOuest- rsquo || pays_v

END

10

Blocks imbriqueacutes et porteacutee des variables

DECLARE

variable1_v NUMBER(3) = 10

BEGIN

DECLARE

variable2_v NUMBER(3) = 10

BEGIN

END

END

variable1_v

variable1_v variable2_v

variable1_v

11

Blocks imbriqueacutes et porteacutee des variables

DECLARE

variable1_v NUMBER(3) = 10

BEGIN

DECLARE

variable1_v NUMBER(3) = 200

BEGIN

END

END

variable1_v (10)

variable1_v (200)

variable1_v (10)

12

Blocks imbriqueacutes et porteacutee des variables

DECLAREpoids_v NUMBER(3) = 600

message_v VARCHAR2(255) = lsquoProduit 10012rsquo

BEGIN

DECLAREpoids_v NUMBER(3) = 1 -- (poids_v =1)message_v VARCHAR2(255) = lsquoProduit 11001rsquo

pays_v VARCHAR2(50) = lsquoEuropersquo

BEGIN

poids_v = poids_v +1 -- (poids_v = 2)

pays_v = lsquoOuest- rsquo || pays_v

END

poids_v = poids_v +1 -- (poids_v = 601)

message_v = mesage_v || lsquo est en stockrsquo -- (message_v = lsquoProduit 10012 est en stockrsquo)

pays_v = lsquoOuest- rsquo || pays_v -- ILLEGAL

END

13

Exercices

14

Structures de controcircle

bull Branchements conditionnelsndash IF - THEN - END IF

ndash IF - THEN - ELSE - END IF

ndash IF - THEN - ELSIF - END IF

bull Bouclesndash LOOP - END LOOP

ndash FOR - END LOOP

ndash WHILE - END LOOP

ndash Note la commande EXIT permet de sortir de tout type de boucle

ndash Exit when permet de sortir de la boucle selon une condition

15

Structures de controcircle - branchements conditionnels

bull Syntaxe IF ltconditiongt THEN

commandes [ELSIF ltconditiongt THEN

commandes ][ELSE

commandes ]END IF

Note vous pouvez utiliser lrsquoexpression IS NULL dans les conditions

bull Exemples IF nomEmploye_v = lsquoTOTOrsquo THEN

salaire_v = salaire_v 2 END IF

16

Structures de controcircle - branchements conditionnels

IF nomEmploye_v = lsquoTOTOrsquo THENsalaire_v = salaire_v 2

ELSE salaire_v = salaire_v 3

END IF

IF nomEmploye_v = lsquoTOTOrsquo THENsalaire_v = salaire_v 2

ELSIF salaire_v gt 10000 THENsalaire_v = salaire_v 2

ELSE salaire_v = salaire_v 3

END IF

17

Exercices

1- Ecrire un programme plsql qui calcule la somme le produit de deux variables

2- Ecrire un code plSql qui permet de tester le signe drsquoune variable A ( srsquoelle est positive elle reccediloive -1 sinon elle reccediloive +1)

3- Ecrire un code plsql qui donne une appreacuteciation sur une note srsquoelle est lt10 le programme donne a une variable de chaine de caractegraveres la valeur lsquomalrsquo srsquoelle est gt a 10 et lt12 il lui donne la valeur lsquoassez bienrsquo sinon lsquoBienrsquo

18

Structures de controcircle - boucles LOOP

bull Note Sans commande EXIT les boucles LOOP sont infinies

bull Syntaxe LOOP

commandes EXIT [WHEN ltconditiongt]

END LOOP

19

Structures de controcircle - boucles LOOP

bull Exemple

DECLARE

noEmp_v NUMBER (3) = 1

BEGIN

LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1

EXIT WHEN noEmp gt 100

END LOOP

END

20

Structures de controcircle - boucles FOR

bull Syntaxe FOR ltcompteurgt IN ltlimite_infgt ltlimite_supgt

commandes

END LOOP

bull Exemple

DECLARE

noEmp NUMBER (3)

BEGIN

FOR noEmp IN 1 100

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END LOOP

END

21

Structures de controcircle - boucles WHILE

bull Syntaxe WHILE ltconditiongt LOOP

commandes

END LOOP bull Exemple DECLARE

noEmp_v NUMBER (3)BEGIN

noEmp_v = 1WHILE noEmp_v lt= 100 LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1 END LOOP

END

22

Structures de controcircles - remarques sur les boucles

bull Ne pas modifier le compteur drsquoune boucle FORbull Les boucles peuvent ecirctre imbriqueacuteesbull On peut nommer les boucles pour identifier explicitement laquelle de deux

boucles imbriqueacutees se termine ltltboucleExternegtgtLOOP

EXIT WHEN compteur_v = 10 ltltboucleInternegtgt

LOOP EXIT boucleExterne WHEN compteur_v = 100 EXIT boucleInterne WHEN drapeau_v = TRUE

END LOOP boucleInterne END LOOP boucleExterne

23

Interactions avec le serveur Oracle

bull Inclure une requecircte SELECT dans un block PLSQL

bull Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull Modifier des donneacutees dans PLSQL

bull Controcircler les transactions dans PLSQL

bull Deacuteterminer le reacutesultat drsquoune requecircte SELECT dans PLSQL

24

Inclure une requecircte SELECT dans PLSQL

DECLARE

noDept_v NUMBER(2)

lieu_v VARCHAR2(15)

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

ATTENTION la requecircte ne doit retourner que un et un seul tuple Si ce nrsquoest pas le cas les exceptions NO_DATA_FOUND ou TOO_MANY_ROWS sont leveacutees

25

Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull TYPE identifie dynamiquement le type drsquoun attribut drsquoune table

bull ROWTYPEidentifie dynamiquement le type (structureacute) drsquoun tuple drsquoune table

DECLAREdateCommande_v CommandedateCommandeTYPE uneCommande_v CommandeROWTYPE

26

Exemple requecircte SELECT dans PLSQL

DECLARE

noDept_v DepartementnoDeptTYPE

lieu_v DepartementlieuTYPE

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

27

Exemple requecircte SELECT dans PLSQL

DECLARE

sommeSalaires_v EmployesalaireTYPE

noDept_v NUMBER NOT NULL = 10

BEGIN

SELECT SUM(salaire)

INTO sommeSalaires_v

FROM Employe

WHERE noDepartement = noDept_v

END

28

Modifier des donneacutees dans PLSQL

bull Trois commandes du langage de manipulation de donneacutees (LMD) de SQL permettent de modifier une base de donneacutees ndash INSERT

ndash UPDATE

ndash DELETE

29

Modifier des donneacutees dans PLSQL (INSERT)

BEGIN

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (10 lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END

bull Note ndash on peut eacutevidemment utiliser des variables au lieu de simples valeurs

preacutedeacutefinies

30

Modifier des donneacutees dans PLSQL (UPDATE)

DECLAREmajorationSalaire_v EmployesalaireTYPE = 2000

BEGINUPDATE EmployeSET salaire = salaire + majorationSalaire_vWHERE job = lsquoPROGRAMMEURrsquo

END

bull Note ndash contrairement aux affectations PLSQL la clause update utilise le signe

lsquo=lsquo comme opeacuterateur drsquoaffectationndash si une variable a le mecircme nom qursquoun nom drsquoattribut de la table manipuleacutee

dans la clause WHERE le serveur Oracle utilise en prioriteacute lrsquoattribut de table

31

Modifier des donneacutees dans PLSQL (DELETE)

DECLARE

noDept_v EmployenoDeptTYPE = 10

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

END

32

Controcircler les transactions dans PLSQL

bull La premiegravere commande INSERTUPDATEDELETECREATEDROP drsquoun block entamme une nouvelle transaction

bull La fin du block ne termine pas la transactionbull Pour terminer explicitement une transaction utiliser les commandes SQL

ndash COMMIT=gt valide les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

ndash ROLLBACK=gt annule toutes les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

bull Note Une transaction doit ecirctre un ensemble homogegravene de manipulations de la base de donneacutees =gt il faut reacuteflechir agrave tous les endroits ougrave il est leacutegitime de mettre un COMMIT

33

Controcircler les transactions dans PLSQL

DECLARE

noDept_v EmployenoDeptTYPE = 10

majorationSalaire_v EmployesalaireTYPE = 2000

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

COMMIT

UPDATE Employe

SET salaire = salaire + majorationSalaire_v

WHERE job = lsquoPROGRAMMEURrsquo

END

34

Affichage des donneacutees

Option

set serveroutput on cette option permet drsquoactiver lrsquoaffichage des donneacutees dans lrsquooutil sqlplus

Pour afficher un message ou une variable

DBMS_OUTPUTPUT_LINE(lsquomessagersquo)

35

Gestion des exceptionstraitement des erreurs

36

Gestion des exceptions

37

Gestion des exceptions Exemple

38

Gestion des curseurs

bull Neacutecessite lrsquoutilisation de curseurs

Les curseurs sont des zones de travail priveacutees ce sont des zones meacutemoire utiliseacutees pour analyser et interpreacuteter tout ordre SQL

bull Deux types de curseurs

bull les curseurs implicites

Le serveur Oracle utilise des curseurs implicites pour exeacutecuter les requecirctes SQL

bull les curseurs explicites

sont des variables explicitement deacuteclareacutees par le programmeur

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 2: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

2

Introduction

Pourquoi PLSQL 1048713 SQL est un langage non proceacutedural1048713 Les traitements complexes sont parfois difficiles agrave eacutecrire si on ne peut utiliser des variables et les structures de programmation comme les boucles et les alternativesUtilisation de PLSQL1048713 PLSQL peut ecirctre utiliseacute pour lrsquoeacutecriture des proceacutedures stockeacutees et des triggers (Oracle accepte aussi le langage Java)1048713 Il convient aussi pour eacutecrire des fonctions utilisateurs qui peuvent ecirctre utiliseacutees dans les requecirctes SQL (en plus des fonctions preacutedeacutefinies)1048713 Il est aussi utiliseacute dans des outils Oracle Forms et Report en particulier

1048713 PLSQL est un langage proprieacutetaire de Oracle

3

Structure drsquoun programme

Un programme est structureacute en blocs drsquoinstructions de 3 types bull proceacutedures anonymesbull proceacutedures nommeacuteesbull fonctions nommeacutees DECLARE -- deacutefinitions de variables BEGIN -- Les instructions agrave exeacutecuter EXCEPTION -- La reacutecupeacuteration des erreurs END

4

Variables

1048713 Identificateurs Oracle

30 caractegraveres au plus

Commence par une lettre

Peut contenir lettres chiffres _ $ et

Pas sensible agrave la casse

1048713 Types de variables

bull Les types habituels correspondants aux types SQL2 Oracle integer varcharhellip

bull Types composites adapteacutes agrave la reacutecupeacuteration des colonnes et lignes des tables SQL TYPE ROWTYPE

5

Variables

1048713 Deacuteclaration drsquoune variable identificateur [CONSTANT] type [= valeur]Exemples bull age integer=20bull nom varchar(30) bull dateNaissance datebull ok boolean = truebull PI CONSTANT REAL=500 Deacuteclarations multiples interdites On peut deacuteclarer qursquoune variable est du mecircme type qursquoune colonne

drsquoune table (ou qursquoune autre variable) bull NC clientnomTYPEbull Age numberbull Age1 agetype

6

Variables

1048713 Une variable peut contenir toutes les colonnes drsquoune ligne drsquoune table

bull employe empROWTYPE

bull deacuteclare que la variable employe contiendra une ligne de la table emp

bull Exemple drsquoutilisation

employe empROWTYPE

nom empnomeTYPE

select INTO employe from emp where matr = 900

nom = employenome

employedept = 20

hellip

insert into emp values employe

7

Opeacuterateurs

bull Arithmeacutetique+ -

bull Concateacutenation||

bull Parenthegravese pour controcircler les prioriteacutes des opeacuterations( )

bull Affectation=

bull Comparaison= ltgt lt gt lt= gt= IS NULL LIKE BETWEEN IN

bull LogiqueAND OR NOT

bull Conversion de types

8

Conversions de types de donneacutees

bull Les meacutelanges de types ndash provoquent des erreurs

ndash affectent les performances

bull Fonctions de conversion ndash TO_CHAR

ndash TO_DATE

ndash TO_NUMBER

bull Exemple V = USER || lsquo rsquo || DATE -- Types incompatibles V = USER || lsquo rsquo || TO_CHAR(SYSDATE) -- ok

9

Blocks imbriqueacutes et porteacutee des variables (Exemple)

DECLAREpoids_v NUMBER(3) = 600

message_v VARCHAR2(255) = lsquoProduit 10012rsquo

BEGIN

DECLAREpoids_v NUMBER(3) = 1 message_v VARCHAR2(255) = lsquoProduit 11001rsquo

pays_v VARCHAR2(50) = lsquoEuropersquo

BEGIN

poids_v = poids_v +1

pays_v = lsquoOuest- rsquo || pays_v

END

poids_v = poids_v +1

message_v = mesage_v || lsquo est en stockrsquo

pays_v = lsquoOuest- rsquo || pays_v

END

10

Blocks imbriqueacutes et porteacutee des variables

DECLARE

variable1_v NUMBER(3) = 10

BEGIN

DECLARE

variable2_v NUMBER(3) = 10

BEGIN

END

END

variable1_v

variable1_v variable2_v

variable1_v

11

Blocks imbriqueacutes et porteacutee des variables

DECLARE

variable1_v NUMBER(3) = 10

BEGIN

DECLARE

variable1_v NUMBER(3) = 200

BEGIN

END

END

variable1_v (10)

variable1_v (200)

variable1_v (10)

12

Blocks imbriqueacutes et porteacutee des variables

DECLAREpoids_v NUMBER(3) = 600

message_v VARCHAR2(255) = lsquoProduit 10012rsquo

BEGIN

DECLAREpoids_v NUMBER(3) = 1 -- (poids_v =1)message_v VARCHAR2(255) = lsquoProduit 11001rsquo

pays_v VARCHAR2(50) = lsquoEuropersquo

BEGIN

poids_v = poids_v +1 -- (poids_v = 2)

pays_v = lsquoOuest- rsquo || pays_v

END

poids_v = poids_v +1 -- (poids_v = 601)

message_v = mesage_v || lsquo est en stockrsquo -- (message_v = lsquoProduit 10012 est en stockrsquo)

pays_v = lsquoOuest- rsquo || pays_v -- ILLEGAL

END

13

Exercices

14

Structures de controcircle

bull Branchements conditionnelsndash IF - THEN - END IF

ndash IF - THEN - ELSE - END IF

ndash IF - THEN - ELSIF - END IF

bull Bouclesndash LOOP - END LOOP

ndash FOR - END LOOP

ndash WHILE - END LOOP

ndash Note la commande EXIT permet de sortir de tout type de boucle

ndash Exit when permet de sortir de la boucle selon une condition

15

Structures de controcircle - branchements conditionnels

bull Syntaxe IF ltconditiongt THEN

commandes [ELSIF ltconditiongt THEN

commandes ][ELSE

commandes ]END IF

Note vous pouvez utiliser lrsquoexpression IS NULL dans les conditions

bull Exemples IF nomEmploye_v = lsquoTOTOrsquo THEN

salaire_v = salaire_v 2 END IF

16

Structures de controcircle - branchements conditionnels

IF nomEmploye_v = lsquoTOTOrsquo THENsalaire_v = salaire_v 2

ELSE salaire_v = salaire_v 3

END IF

IF nomEmploye_v = lsquoTOTOrsquo THENsalaire_v = salaire_v 2

ELSIF salaire_v gt 10000 THENsalaire_v = salaire_v 2

ELSE salaire_v = salaire_v 3

END IF

17

Exercices

1- Ecrire un programme plsql qui calcule la somme le produit de deux variables

2- Ecrire un code plSql qui permet de tester le signe drsquoune variable A ( srsquoelle est positive elle reccediloive -1 sinon elle reccediloive +1)

3- Ecrire un code plsql qui donne une appreacuteciation sur une note srsquoelle est lt10 le programme donne a une variable de chaine de caractegraveres la valeur lsquomalrsquo srsquoelle est gt a 10 et lt12 il lui donne la valeur lsquoassez bienrsquo sinon lsquoBienrsquo

18

Structures de controcircle - boucles LOOP

bull Note Sans commande EXIT les boucles LOOP sont infinies

bull Syntaxe LOOP

commandes EXIT [WHEN ltconditiongt]

END LOOP

19

Structures de controcircle - boucles LOOP

bull Exemple

DECLARE

noEmp_v NUMBER (3) = 1

BEGIN

LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1

EXIT WHEN noEmp gt 100

END LOOP

END

20

Structures de controcircle - boucles FOR

bull Syntaxe FOR ltcompteurgt IN ltlimite_infgt ltlimite_supgt

commandes

END LOOP

bull Exemple

DECLARE

noEmp NUMBER (3)

BEGIN

FOR noEmp IN 1 100

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END LOOP

END

21

Structures de controcircle - boucles WHILE

bull Syntaxe WHILE ltconditiongt LOOP

commandes

END LOOP bull Exemple DECLARE

noEmp_v NUMBER (3)BEGIN

noEmp_v = 1WHILE noEmp_v lt= 100 LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1 END LOOP

END

22

Structures de controcircles - remarques sur les boucles

bull Ne pas modifier le compteur drsquoune boucle FORbull Les boucles peuvent ecirctre imbriqueacuteesbull On peut nommer les boucles pour identifier explicitement laquelle de deux

boucles imbriqueacutees se termine ltltboucleExternegtgtLOOP

EXIT WHEN compteur_v = 10 ltltboucleInternegtgt

LOOP EXIT boucleExterne WHEN compteur_v = 100 EXIT boucleInterne WHEN drapeau_v = TRUE

END LOOP boucleInterne END LOOP boucleExterne

23

Interactions avec le serveur Oracle

bull Inclure une requecircte SELECT dans un block PLSQL

bull Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull Modifier des donneacutees dans PLSQL

bull Controcircler les transactions dans PLSQL

bull Deacuteterminer le reacutesultat drsquoune requecircte SELECT dans PLSQL

24

Inclure une requecircte SELECT dans PLSQL

DECLARE

noDept_v NUMBER(2)

lieu_v VARCHAR2(15)

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

ATTENTION la requecircte ne doit retourner que un et un seul tuple Si ce nrsquoest pas le cas les exceptions NO_DATA_FOUND ou TOO_MANY_ROWS sont leveacutees

25

Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull TYPE identifie dynamiquement le type drsquoun attribut drsquoune table

bull ROWTYPEidentifie dynamiquement le type (structureacute) drsquoun tuple drsquoune table

DECLAREdateCommande_v CommandedateCommandeTYPE uneCommande_v CommandeROWTYPE

26

Exemple requecircte SELECT dans PLSQL

DECLARE

noDept_v DepartementnoDeptTYPE

lieu_v DepartementlieuTYPE

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

27

Exemple requecircte SELECT dans PLSQL

DECLARE

sommeSalaires_v EmployesalaireTYPE

noDept_v NUMBER NOT NULL = 10

BEGIN

SELECT SUM(salaire)

INTO sommeSalaires_v

FROM Employe

WHERE noDepartement = noDept_v

END

28

Modifier des donneacutees dans PLSQL

bull Trois commandes du langage de manipulation de donneacutees (LMD) de SQL permettent de modifier une base de donneacutees ndash INSERT

ndash UPDATE

ndash DELETE

29

Modifier des donneacutees dans PLSQL (INSERT)

BEGIN

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (10 lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END

bull Note ndash on peut eacutevidemment utiliser des variables au lieu de simples valeurs

preacutedeacutefinies

30

Modifier des donneacutees dans PLSQL (UPDATE)

DECLAREmajorationSalaire_v EmployesalaireTYPE = 2000

BEGINUPDATE EmployeSET salaire = salaire + majorationSalaire_vWHERE job = lsquoPROGRAMMEURrsquo

END

bull Note ndash contrairement aux affectations PLSQL la clause update utilise le signe

lsquo=lsquo comme opeacuterateur drsquoaffectationndash si une variable a le mecircme nom qursquoun nom drsquoattribut de la table manipuleacutee

dans la clause WHERE le serveur Oracle utilise en prioriteacute lrsquoattribut de table

31

Modifier des donneacutees dans PLSQL (DELETE)

DECLARE

noDept_v EmployenoDeptTYPE = 10

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

END

32

Controcircler les transactions dans PLSQL

bull La premiegravere commande INSERTUPDATEDELETECREATEDROP drsquoun block entamme une nouvelle transaction

bull La fin du block ne termine pas la transactionbull Pour terminer explicitement une transaction utiliser les commandes SQL

ndash COMMIT=gt valide les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

ndash ROLLBACK=gt annule toutes les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

bull Note Une transaction doit ecirctre un ensemble homogegravene de manipulations de la base de donneacutees =gt il faut reacuteflechir agrave tous les endroits ougrave il est leacutegitime de mettre un COMMIT

33

Controcircler les transactions dans PLSQL

DECLARE

noDept_v EmployenoDeptTYPE = 10

majorationSalaire_v EmployesalaireTYPE = 2000

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

COMMIT

UPDATE Employe

SET salaire = salaire + majorationSalaire_v

WHERE job = lsquoPROGRAMMEURrsquo

END

34

Affichage des donneacutees

Option

set serveroutput on cette option permet drsquoactiver lrsquoaffichage des donneacutees dans lrsquooutil sqlplus

Pour afficher un message ou une variable

DBMS_OUTPUTPUT_LINE(lsquomessagersquo)

35

Gestion des exceptionstraitement des erreurs

36

Gestion des exceptions

37

Gestion des exceptions Exemple

38

Gestion des curseurs

bull Neacutecessite lrsquoutilisation de curseurs

Les curseurs sont des zones de travail priveacutees ce sont des zones meacutemoire utiliseacutees pour analyser et interpreacuteter tout ordre SQL

bull Deux types de curseurs

bull les curseurs implicites

Le serveur Oracle utilise des curseurs implicites pour exeacutecuter les requecirctes SQL

bull les curseurs explicites

sont des variables explicitement deacuteclareacutees par le programmeur

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 3: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

3

Structure drsquoun programme

Un programme est structureacute en blocs drsquoinstructions de 3 types bull proceacutedures anonymesbull proceacutedures nommeacuteesbull fonctions nommeacutees DECLARE -- deacutefinitions de variables BEGIN -- Les instructions agrave exeacutecuter EXCEPTION -- La reacutecupeacuteration des erreurs END

4

Variables

1048713 Identificateurs Oracle

30 caractegraveres au plus

Commence par une lettre

Peut contenir lettres chiffres _ $ et

Pas sensible agrave la casse

1048713 Types de variables

bull Les types habituels correspondants aux types SQL2 Oracle integer varcharhellip

bull Types composites adapteacutes agrave la reacutecupeacuteration des colonnes et lignes des tables SQL TYPE ROWTYPE

5

Variables

1048713 Deacuteclaration drsquoune variable identificateur [CONSTANT] type [= valeur]Exemples bull age integer=20bull nom varchar(30) bull dateNaissance datebull ok boolean = truebull PI CONSTANT REAL=500 Deacuteclarations multiples interdites On peut deacuteclarer qursquoune variable est du mecircme type qursquoune colonne

drsquoune table (ou qursquoune autre variable) bull NC clientnomTYPEbull Age numberbull Age1 agetype

6

Variables

1048713 Une variable peut contenir toutes les colonnes drsquoune ligne drsquoune table

bull employe empROWTYPE

bull deacuteclare que la variable employe contiendra une ligne de la table emp

bull Exemple drsquoutilisation

employe empROWTYPE

nom empnomeTYPE

select INTO employe from emp where matr = 900

nom = employenome

employedept = 20

hellip

insert into emp values employe

7

Opeacuterateurs

bull Arithmeacutetique+ -

bull Concateacutenation||

bull Parenthegravese pour controcircler les prioriteacutes des opeacuterations( )

bull Affectation=

bull Comparaison= ltgt lt gt lt= gt= IS NULL LIKE BETWEEN IN

bull LogiqueAND OR NOT

bull Conversion de types

8

Conversions de types de donneacutees

bull Les meacutelanges de types ndash provoquent des erreurs

ndash affectent les performances

bull Fonctions de conversion ndash TO_CHAR

ndash TO_DATE

ndash TO_NUMBER

bull Exemple V = USER || lsquo rsquo || DATE -- Types incompatibles V = USER || lsquo rsquo || TO_CHAR(SYSDATE) -- ok

9

Blocks imbriqueacutes et porteacutee des variables (Exemple)

DECLAREpoids_v NUMBER(3) = 600

message_v VARCHAR2(255) = lsquoProduit 10012rsquo

BEGIN

DECLAREpoids_v NUMBER(3) = 1 message_v VARCHAR2(255) = lsquoProduit 11001rsquo

pays_v VARCHAR2(50) = lsquoEuropersquo

BEGIN

poids_v = poids_v +1

pays_v = lsquoOuest- rsquo || pays_v

END

poids_v = poids_v +1

message_v = mesage_v || lsquo est en stockrsquo

pays_v = lsquoOuest- rsquo || pays_v

END

10

Blocks imbriqueacutes et porteacutee des variables

DECLARE

variable1_v NUMBER(3) = 10

BEGIN

DECLARE

variable2_v NUMBER(3) = 10

BEGIN

END

END

variable1_v

variable1_v variable2_v

variable1_v

11

Blocks imbriqueacutes et porteacutee des variables

DECLARE

variable1_v NUMBER(3) = 10

BEGIN

DECLARE

variable1_v NUMBER(3) = 200

BEGIN

END

END

variable1_v (10)

variable1_v (200)

variable1_v (10)

12

Blocks imbriqueacutes et porteacutee des variables

DECLAREpoids_v NUMBER(3) = 600

message_v VARCHAR2(255) = lsquoProduit 10012rsquo

BEGIN

DECLAREpoids_v NUMBER(3) = 1 -- (poids_v =1)message_v VARCHAR2(255) = lsquoProduit 11001rsquo

pays_v VARCHAR2(50) = lsquoEuropersquo

BEGIN

poids_v = poids_v +1 -- (poids_v = 2)

pays_v = lsquoOuest- rsquo || pays_v

END

poids_v = poids_v +1 -- (poids_v = 601)

message_v = mesage_v || lsquo est en stockrsquo -- (message_v = lsquoProduit 10012 est en stockrsquo)

pays_v = lsquoOuest- rsquo || pays_v -- ILLEGAL

END

13

Exercices

14

Structures de controcircle

bull Branchements conditionnelsndash IF - THEN - END IF

ndash IF - THEN - ELSE - END IF

ndash IF - THEN - ELSIF - END IF

bull Bouclesndash LOOP - END LOOP

ndash FOR - END LOOP

ndash WHILE - END LOOP

ndash Note la commande EXIT permet de sortir de tout type de boucle

ndash Exit when permet de sortir de la boucle selon une condition

15

Structures de controcircle - branchements conditionnels

bull Syntaxe IF ltconditiongt THEN

commandes [ELSIF ltconditiongt THEN

commandes ][ELSE

commandes ]END IF

Note vous pouvez utiliser lrsquoexpression IS NULL dans les conditions

bull Exemples IF nomEmploye_v = lsquoTOTOrsquo THEN

salaire_v = salaire_v 2 END IF

16

Structures de controcircle - branchements conditionnels

IF nomEmploye_v = lsquoTOTOrsquo THENsalaire_v = salaire_v 2

ELSE salaire_v = salaire_v 3

END IF

IF nomEmploye_v = lsquoTOTOrsquo THENsalaire_v = salaire_v 2

ELSIF salaire_v gt 10000 THENsalaire_v = salaire_v 2

ELSE salaire_v = salaire_v 3

END IF

17

Exercices

1- Ecrire un programme plsql qui calcule la somme le produit de deux variables

2- Ecrire un code plSql qui permet de tester le signe drsquoune variable A ( srsquoelle est positive elle reccediloive -1 sinon elle reccediloive +1)

3- Ecrire un code plsql qui donne une appreacuteciation sur une note srsquoelle est lt10 le programme donne a une variable de chaine de caractegraveres la valeur lsquomalrsquo srsquoelle est gt a 10 et lt12 il lui donne la valeur lsquoassez bienrsquo sinon lsquoBienrsquo

18

Structures de controcircle - boucles LOOP

bull Note Sans commande EXIT les boucles LOOP sont infinies

bull Syntaxe LOOP

commandes EXIT [WHEN ltconditiongt]

END LOOP

19

Structures de controcircle - boucles LOOP

bull Exemple

DECLARE

noEmp_v NUMBER (3) = 1

BEGIN

LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1

EXIT WHEN noEmp gt 100

END LOOP

END

20

Structures de controcircle - boucles FOR

bull Syntaxe FOR ltcompteurgt IN ltlimite_infgt ltlimite_supgt

commandes

END LOOP

bull Exemple

DECLARE

noEmp NUMBER (3)

BEGIN

FOR noEmp IN 1 100

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END LOOP

END

21

Structures de controcircle - boucles WHILE

bull Syntaxe WHILE ltconditiongt LOOP

commandes

END LOOP bull Exemple DECLARE

noEmp_v NUMBER (3)BEGIN

noEmp_v = 1WHILE noEmp_v lt= 100 LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1 END LOOP

END

22

Structures de controcircles - remarques sur les boucles

bull Ne pas modifier le compteur drsquoune boucle FORbull Les boucles peuvent ecirctre imbriqueacuteesbull On peut nommer les boucles pour identifier explicitement laquelle de deux

boucles imbriqueacutees se termine ltltboucleExternegtgtLOOP

EXIT WHEN compteur_v = 10 ltltboucleInternegtgt

LOOP EXIT boucleExterne WHEN compteur_v = 100 EXIT boucleInterne WHEN drapeau_v = TRUE

END LOOP boucleInterne END LOOP boucleExterne

23

Interactions avec le serveur Oracle

bull Inclure une requecircte SELECT dans un block PLSQL

bull Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull Modifier des donneacutees dans PLSQL

bull Controcircler les transactions dans PLSQL

bull Deacuteterminer le reacutesultat drsquoune requecircte SELECT dans PLSQL

24

Inclure une requecircte SELECT dans PLSQL

DECLARE

noDept_v NUMBER(2)

lieu_v VARCHAR2(15)

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

ATTENTION la requecircte ne doit retourner que un et un seul tuple Si ce nrsquoest pas le cas les exceptions NO_DATA_FOUND ou TOO_MANY_ROWS sont leveacutees

25

Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull TYPE identifie dynamiquement le type drsquoun attribut drsquoune table

bull ROWTYPEidentifie dynamiquement le type (structureacute) drsquoun tuple drsquoune table

DECLAREdateCommande_v CommandedateCommandeTYPE uneCommande_v CommandeROWTYPE

26

Exemple requecircte SELECT dans PLSQL

DECLARE

noDept_v DepartementnoDeptTYPE

lieu_v DepartementlieuTYPE

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

27

Exemple requecircte SELECT dans PLSQL

DECLARE

sommeSalaires_v EmployesalaireTYPE

noDept_v NUMBER NOT NULL = 10

BEGIN

SELECT SUM(salaire)

INTO sommeSalaires_v

FROM Employe

WHERE noDepartement = noDept_v

END

28

Modifier des donneacutees dans PLSQL

bull Trois commandes du langage de manipulation de donneacutees (LMD) de SQL permettent de modifier une base de donneacutees ndash INSERT

ndash UPDATE

ndash DELETE

29

Modifier des donneacutees dans PLSQL (INSERT)

BEGIN

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (10 lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END

bull Note ndash on peut eacutevidemment utiliser des variables au lieu de simples valeurs

preacutedeacutefinies

30

Modifier des donneacutees dans PLSQL (UPDATE)

DECLAREmajorationSalaire_v EmployesalaireTYPE = 2000

BEGINUPDATE EmployeSET salaire = salaire + majorationSalaire_vWHERE job = lsquoPROGRAMMEURrsquo

END

bull Note ndash contrairement aux affectations PLSQL la clause update utilise le signe

lsquo=lsquo comme opeacuterateur drsquoaffectationndash si une variable a le mecircme nom qursquoun nom drsquoattribut de la table manipuleacutee

dans la clause WHERE le serveur Oracle utilise en prioriteacute lrsquoattribut de table

31

Modifier des donneacutees dans PLSQL (DELETE)

DECLARE

noDept_v EmployenoDeptTYPE = 10

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

END

32

Controcircler les transactions dans PLSQL

bull La premiegravere commande INSERTUPDATEDELETECREATEDROP drsquoun block entamme une nouvelle transaction

bull La fin du block ne termine pas la transactionbull Pour terminer explicitement une transaction utiliser les commandes SQL

ndash COMMIT=gt valide les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

ndash ROLLBACK=gt annule toutes les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

bull Note Une transaction doit ecirctre un ensemble homogegravene de manipulations de la base de donneacutees =gt il faut reacuteflechir agrave tous les endroits ougrave il est leacutegitime de mettre un COMMIT

33

Controcircler les transactions dans PLSQL

DECLARE

noDept_v EmployenoDeptTYPE = 10

majorationSalaire_v EmployesalaireTYPE = 2000

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

COMMIT

UPDATE Employe

SET salaire = salaire + majorationSalaire_v

WHERE job = lsquoPROGRAMMEURrsquo

END

34

Affichage des donneacutees

Option

set serveroutput on cette option permet drsquoactiver lrsquoaffichage des donneacutees dans lrsquooutil sqlplus

Pour afficher un message ou une variable

DBMS_OUTPUTPUT_LINE(lsquomessagersquo)

35

Gestion des exceptionstraitement des erreurs

36

Gestion des exceptions

37

Gestion des exceptions Exemple

38

Gestion des curseurs

bull Neacutecessite lrsquoutilisation de curseurs

Les curseurs sont des zones de travail priveacutees ce sont des zones meacutemoire utiliseacutees pour analyser et interpreacuteter tout ordre SQL

bull Deux types de curseurs

bull les curseurs implicites

Le serveur Oracle utilise des curseurs implicites pour exeacutecuter les requecirctes SQL

bull les curseurs explicites

sont des variables explicitement deacuteclareacutees par le programmeur

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 4: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

4

Variables

1048713 Identificateurs Oracle

30 caractegraveres au plus

Commence par une lettre

Peut contenir lettres chiffres _ $ et

Pas sensible agrave la casse

1048713 Types de variables

bull Les types habituels correspondants aux types SQL2 Oracle integer varcharhellip

bull Types composites adapteacutes agrave la reacutecupeacuteration des colonnes et lignes des tables SQL TYPE ROWTYPE

5

Variables

1048713 Deacuteclaration drsquoune variable identificateur [CONSTANT] type [= valeur]Exemples bull age integer=20bull nom varchar(30) bull dateNaissance datebull ok boolean = truebull PI CONSTANT REAL=500 Deacuteclarations multiples interdites On peut deacuteclarer qursquoune variable est du mecircme type qursquoune colonne

drsquoune table (ou qursquoune autre variable) bull NC clientnomTYPEbull Age numberbull Age1 agetype

6

Variables

1048713 Une variable peut contenir toutes les colonnes drsquoune ligne drsquoune table

bull employe empROWTYPE

bull deacuteclare que la variable employe contiendra une ligne de la table emp

bull Exemple drsquoutilisation

employe empROWTYPE

nom empnomeTYPE

select INTO employe from emp where matr = 900

nom = employenome

employedept = 20

hellip

insert into emp values employe

7

Opeacuterateurs

bull Arithmeacutetique+ -

bull Concateacutenation||

bull Parenthegravese pour controcircler les prioriteacutes des opeacuterations( )

bull Affectation=

bull Comparaison= ltgt lt gt lt= gt= IS NULL LIKE BETWEEN IN

bull LogiqueAND OR NOT

bull Conversion de types

8

Conversions de types de donneacutees

bull Les meacutelanges de types ndash provoquent des erreurs

ndash affectent les performances

bull Fonctions de conversion ndash TO_CHAR

ndash TO_DATE

ndash TO_NUMBER

bull Exemple V = USER || lsquo rsquo || DATE -- Types incompatibles V = USER || lsquo rsquo || TO_CHAR(SYSDATE) -- ok

9

Blocks imbriqueacutes et porteacutee des variables (Exemple)

DECLAREpoids_v NUMBER(3) = 600

message_v VARCHAR2(255) = lsquoProduit 10012rsquo

BEGIN

DECLAREpoids_v NUMBER(3) = 1 message_v VARCHAR2(255) = lsquoProduit 11001rsquo

pays_v VARCHAR2(50) = lsquoEuropersquo

BEGIN

poids_v = poids_v +1

pays_v = lsquoOuest- rsquo || pays_v

END

poids_v = poids_v +1

message_v = mesage_v || lsquo est en stockrsquo

pays_v = lsquoOuest- rsquo || pays_v

END

10

Blocks imbriqueacutes et porteacutee des variables

DECLARE

variable1_v NUMBER(3) = 10

BEGIN

DECLARE

variable2_v NUMBER(3) = 10

BEGIN

END

END

variable1_v

variable1_v variable2_v

variable1_v

11

Blocks imbriqueacutes et porteacutee des variables

DECLARE

variable1_v NUMBER(3) = 10

BEGIN

DECLARE

variable1_v NUMBER(3) = 200

BEGIN

END

END

variable1_v (10)

variable1_v (200)

variable1_v (10)

12

Blocks imbriqueacutes et porteacutee des variables

DECLAREpoids_v NUMBER(3) = 600

message_v VARCHAR2(255) = lsquoProduit 10012rsquo

BEGIN

DECLAREpoids_v NUMBER(3) = 1 -- (poids_v =1)message_v VARCHAR2(255) = lsquoProduit 11001rsquo

pays_v VARCHAR2(50) = lsquoEuropersquo

BEGIN

poids_v = poids_v +1 -- (poids_v = 2)

pays_v = lsquoOuest- rsquo || pays_v

END

poids_v = poids_v +1 -- (poids_v = 601)

message_v = mesage_v || lsquo est en stockrsquo -- (message_v = lsquoProduit 10012 est en stockrsquo)

pays_v = lsquoOuest- rsquo || pays_v -- ILLEGAL

END

13

Exercices

14

Structures de controcircle

bull Branchements conditionnelsndash IF - THEN - END IF

ndash IF - THEN - ELSE - END IF

ndash IF - THEN - ELSIF - END IF

bull Bouclesndash LOOP - END LOOP

ndash FOR - END LOOP

ndash WHILE - END LOOP

ndash Note la commande EXIT permet de sortir de tout type de boucle

ndash Exit when permet de sortir de la boucle selon une condition

15

Structures de controcircle - branchements conditionnels

bull Syntaxe IF ltconditiongt THEN

commandes [ELSIF ltconditiongt THEN

commandes ][ELSE

commandes ]END IF

Note vous pouvez utiliser lrsquoexpression IS NULL dans les conditions

bull Exemples IF nomEmploye_v = lsquoTOTOrsquo THEN

salaire_v = salaire_v 2 END IF

16

Structures de controcircle - branchements conditionnels

IF nomEmploye_v = lsquoTOTOrsquo THENsalaire_v = salaire_v 2

ELSE salaire_v = salaire_v 3

END IF

IF nomEmploye_v = lsquoTOTOrsquo THENsalaire_v = salaire_v 2

ELSIF salaire_v gt 10000 THENsalaire_v = salaire_v 2

ELSE salaire_v = salaire_v 3

END IF

17

Exercices

1- Ecrire un programme plsql qui calcule la somme le produit de deux variables

2- Ecrire un code plSql qui permet de tester le signe drsquoune variable A ( srsquoelle est positive elle reccediloive -1 sinon elle reccediloive +1)

3- Ecrire un code plsql qui donne une appreacuteciation sur une note srsquoelle est lt10 le programme donne a une variable de chaine de caractegraveres la valeur lsquomalrsquo srsquoelle est gt a 10 et lt12 il lui donne la valeur lsquoassez bienrsquo sinon lsquoBienrsquo

18

Structures de controcircle - boucles LOOP

bull Note Sans commande EXIT les boucles LOOP sont infinies

bull Syntaxe LOOP

commandes EXIT [WHEN ltconditiongt]

END LOOP

19

Structures de controcircle - boucles LOOP

bull Exemple

DECLARE

noEmp_v NUMBER (3) = 1

BEGIN

LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1

EXIT WHEN noEmp gt 100

END LOOP

END

20

Structures de controcircle - boucles FOR

bull Syntaxe FOR ltcompteurgt IN ltlimite_infgt ltlimite_supgt

commandes

END LOOP

bull Exemple

DECLARE

noEmp NUMBER (3)

BEGIN

FOR noEmp IN 1 100

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END LOOP

END

21

Structures de controcircle - boucles WHILE

bull Syntaxe WHILE ltconditiongt LOOP

commandes

END LOOP bull Exemple DECLARE

noEmp_v NUMBER (3)BEGIN

noEmp_v = 1WHILE noEmp_v lt= 100 LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1 END LOOP

END

22

Structures de controcircles - remarques sur les boucles

bull Ne pas modifier le compteur drsquoune boucle FORbull Les boucles peuvent ecirctre imbriqueacuteesbull On peut nommer les boucles pour identifier explicitement laquelle de deux

boucles imbriqueacutees se termine ltltboucleExternegtgtLOOP

EXIT WHEN compteur_v = 10 ltltboucleInternegtgt

LOOP EXIT boucleExterne WHEN compteur_v = 100 EXIT boucleInterne WHEN drapeau_v = TRUE

END LOOP boucleInterne END LOOP boucleExterne

23

Interactions avec le serveur Oracle

bull Inclure une requecircte SELECT dans un block PLSQL

bull Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull Modifier des donneacutees dans PLSQL

bull Controcircler les transactions dans PLSQL

bull Deacuteterminer le reacutesultat drsquoune requecircte SELECT dans PLSQL

24

Inclure une requecircte SELECT dans PLSQL

DECLARE

noDept_v NUMBER(2)

lieu_v VARCHAR2(15)

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

ATTENTION la requecircte ne doit retourner que un et un seul tuple Si ce nrsquoest pas le cas les exceptions NO_DATA_FOUND ou TOO_MANY_ROWS sont leveacutees

25

Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull TYPE identifie dynamiquement le type drsquoun attribut drsquoune table

bull ROWTYPEidentifie dynamiquement le type (structureacute) drsquoun tuple drsquoune table

DECLAREdateCommande_v CommandedateCommandeTYPE uneCommande_v CommandeROWTYPE

26

Exemple requecircte SELECT dans PLSQL

DECLARE

noDept_v DepartementnoDeptTYPE

lieu_v DepartementlieuTYPE

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

27

Exemple requecircte SELECT dans PLSQL

DECLARE

sommeSalaires_v EmployesalaireTYPE

noDept_v NUMBER NOT NULL = 10

BEGIN

SELECT SUM(salaire)

INTO sommeSalaires_v

FROM Employe

WHERE noDepartement = noDept_v

END

28

Modifier des donneacutees dans PLSQL

bull Trois commandes du langage de manipulation de donneacutees (LMD) de SQL permettent de modifier une base de donneacutees ndash INSERT

ndash UPDATE

ndash DELETE

29

Modifier des donneacutees dans PLSQL (INSERT)

BEGIN

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (10 lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END

bull Note ndash on peut eacutevidemment utiliser des variables au lieu de simples valeurs

preacutedeacutefinies

30

Modifier des donneacutees dans PLSQL (UPDATE)

DECLAREmajorationSalaire_v EmployesalaireTYPE = 2000

BEGINUPDATE EmployeSET salaire = salaire + majorationSalaire_vWHERE job = lsquoPROGRAMMEURrsquo

END

bull Note ndash contrairement aux affectations PLSQL la clause update utilise le signe

lsquo=lsquo comme opeacuterateur drsquoaffectationndash si une variable a le mecircme nom qursquoun nom drsquoattribut de la table manipuleacutee

dans la clause WHERE le serveur Oracle utilise en prioriteacute lrsquoattribut de table

31

Modifier des donneacutees dans PLSQL (DELETE)

DECLARE

noDept_v EmployenoDeptTYPE = 10

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

END

32

Controcircler les transactions dans PLSQL

bull La premiegravere commande INSERTUPDATEDELETECREATEDROP drsquoun block entamme une nouvelle transaction

bull La fin du block ne termine pas la transactionbull Pour terminer explicitement une transaction utiliser les commandes SQL

ndash COMMIT=gt valide les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

ndash ROLLBACK=gt annule toutes les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

bull Note Une transaction doit ecirctre un ensemble homogegravene de manipulations de la base de donneacutees =gt il faut reacuteflechir agrave tous les endroits ougrave il est leacutegitime de mettre un COMMIT

33

Controcircler les transactions dans PLSQL

DECLARE

noDept_v EmployenoDeptTYPE = 10

majorationSalaire_v EmployesalaireTYPE = 2000

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

COMMIT

UPDATE Employe

SET salaire = salaire + majorationSalaire_v

WHERE job = lsquoPROGRAMMEURrsquo

END

34

Affichage des donneacutees

Option

set serveroutput on cette option permet drsquoactiver lrsquoaffichage des donneacutees dans lrsquooutil sqlplus

Pour afficher un message ou une variable

DBMS_OUTPUTPUT_LINE(lsquomessagersquo)

35

Gestion des exceptionstraitement des erreurs

36

Gestion des exceptions

37

Gestion des exceptions Exemple

38

Gestion des curseurs

bull Neacutecessite lrsquoutilisation de curseurs

Les curseurs sont des zones de travail priveacutees ce sont des zones meacutemoire utiliseacutees pour analyser et interpreacuteter tout ordre SQL

bull Deux types de curseurs

bull les curseurs implicites

Le serveur Oracle utilise des curseurs implicites pour exeacutecuter les requecirctes SQL

bull les curseurs explicites

sont des variables explicitement deacuteclareacutees par le programmeur

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 5: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

5

Variables

1048713 Deacuteclaration drsquoune variable identificateur [CONSTANT] type [= valeur]Exemples bull age integer=20bull nom varchar(30) bull dateNaissance datebull ok boolean = truebull PI CONSTANT REAL=500 Deacuteclarations multiples interdites On peut deacuteclarer qursquoune variable est du mecircme type qursquoune colonne

drsquoune table (ou qursquoune autre variable) bull NC clientnomTYPEbull Age numberbull Age1 agetype

6

Variables

1048713 Une variable peut contenir toutes les colonnes drsquoune ligne drsquoune table

bull employe empROWTYPE

bull deacuteclare que la variable employe contiendra une ligne de la table emp

bull Exemple drsquoutilisation

employe empROWTYPE

nom empnomeTYPE

select INTO employe from emp where matr = 900

nom = employenome

employedept = 20

hellip

insert into emp values employe

7

Opeacuterateurs

bull Arithmeacutetique+ -

bull Concateacutenation||

bull Parenthegravese pour controcircler les prioriteacutes des opeacuterations( )

bull Affectation=

bull Comparaison= ltgt lt gt lt= gt= IS NULL LIKE BETWEEN IN

bull LogiqueAND OR NOT

bull Conversion de types

8

Conversions de types de donneacutees

bull Les meacutelanges de types ndash provoquent des erreurs

ndash affectent les performances

bull Fonctions de conversion ndash TO_CHAR

ndash TO_DATE

ndash TO_NUMBER

bull Exemple V = USER || lsquo rsquo || DATE -- Types incompatibles V = USER || lsquo rsquo || TO_CHAR(SYSDATE) -- ok

9

Blocks imbriqueacutes et porteacutee des variables (Exemple)

DECLAREpoids_v NUMBER(3) = 600

message_v VARCHAR2(255) = lsquoProduit 10012rsquo

BEGIN

DECLAREpoids_v NUMBER(3) = 1 message_v VARCHAR2(255) = lsquoProduit 11001rsquo

pays_v VARCHAR2(50) = lsquoEuropersquo

BEGIN

poids_v = poids_v +1

pays_v = lsquoOuest- rsquo || pays_v

END

poids_v = poids_v +1

message_v = mesage_v || lsquo est en stockrsquo

pays_v = lsquoOuest- rsquo || pays_v

END

10

Blocks imbriqueacutes et porteacutee des variables

DECLARE

variable1_v NUMBER(3) = 10

BEGIN

DECLARE

variable2_v NUMBER(3) = 10

BEGIN

END

END

variable1_v

variable1_v variable2_v

variable1_v

11

Blocks imbriqueacutes et porteacutee des variables

DECLARE

variable1_v NUMBER(3) = 10

BEGIN

DECLARE

variable1_v NUMBER(3) = 200

BEGIN

END

END

variable1_v (10)

variable1_v (200)

variable1_v (10)

12

Blocks imbriqueacutes et porteacutee des variables

DECLAREpoids_v NUMBER(3) = 600

message_v VARCHAR2(255) = lsquoProduit 10012rsquo

BEGIN

DECLAREpoids_v NUMBER(3) = 1 -- (poids_v =1)message_v VARCHAR2(255) = lsquoProduit 11001rsquo

pays_v VARCHAR2(50) = lsquoEuropersquo

BEGIN

poids_v = poids_v +1 -- (poids_v = 2)

pays_v = lsquoOuest- rsquo || pays_v

END

poids_v = poids_v +1 -- (poids_v = 601)

message_v = mesage_v || lsquo est en stockrsquo -- (message_v = lsquoProduit 10012 est en stockrsquo)

pays_v = lsquoOuest- rsquo || pays_v -- ILLEGAL

END

13

Exercices

14

Structures de controcircle

bull Branchements conditionnelsndash IF - THEN - END IF

ndash IF - THEN - ELSE - END IF

ndash IF - THEN - ELSIF - END IF

bull Bouclesndash LOOP - END LOOP

ndash FOR - END LOOP

ndash WHILE - END LOOP

ndash Note la commande EXIT permet de sortir de tout type de boucle

ndash Exit when permet de sortir de la boucle selon une condition

15

Structures de controcircle - branchements conditionnels

bull Syntaxe IF ltconditiongt THEN

commandes [ELSIF ltconditiongt THEN

commandes ][ELSE

commandes ]END IF

Note vous pouvez utiliser lrsquoexpression IS NULL dans les conditions

bull Exemples IF nomEmploye_v = lsquoTOTOrsquo THEN

salaire_v = salaire_v 2 END IF

16

Structures de controcircle - branchements conditionnels

IF nomEmploye_v = lsquoTOTOrsquo THENsalaire_v = salaire_v 2

ELSE salaire_v = salaire_v 3

END IF

IF nomEmploye_v = lsquoTOTOrsquo THENsalaire_v = salaire_v 2

ELSIF salaire_v gt 10000 THENsalaire_v = salaire_v 2

ELSE salaire_v = salaire_v 3

END IF

17

Exercices

1- Ecrire un programme plsql qui calcule la somme le produit de deux variables

2- Ecrire un code plSql qui permet de tester le signe drsquoune variable A ( srsquoelle est positive elle reccediloive -1 sinon elle reccediloive +1)

3- Ecrire un code plsql qui donne une appreacuteciation sur une note srsquoelle est lt10 le programme donne a une variable de chaine de caractegraveres la valeur lsquomalrsquo srsquoelle est gt a 10 et lt12 il lui donne la valeur lsquoassez bienrsquo sinon lsquoBienrsquo

18

Structures de controcircle - boucles LOOP

bull Note Sans commande EXIT les boucles LOOP sont infinies

bull Syntaxe LOOP

commandes EXIT [WHEN ltconditiongt]

END LOOP

19

Structures de controcircle - boucles LOOP

bull Exemple

DECLARE

noEmp_v NUMBER (3) = 1

BEGIN

LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1

EXIT WHEN noEmp gt 100

END LOOP

END

20

Structures de controcircle - boucles FOR

bull Syntaxe FOR ltcompteurgt IN ltlimite_infgt ltlimite_supgt

commandes

END LOOP

bull Exemple

DECLARE

noEmp NUMBER (3)

BEGIN

FOR noEmp IN 1 100

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END LOOP

END

21

Structures de controcircle - boucles WHILE

bull Syntaxe WHILE ltconditiongt LOOP

commandes

END LOOP bull Exemple DECLARE

noEmp_v NUMBER (3)BEGIN

noEmp_v = 1WHILE noEmp_v lt= 100 LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1 END LOOP

END

22

Structures de controcircles - remarques sur les boucles

bull Ne pas modifier le compteur drsquoune boucle FORbull Les boucles peuvent ecirctre imbriqueacuteesbull On peut nommer les boucles pour identifier explicitement laquelle de deux

boucles imbriqueacutees se termine ltltboucleExternegtgtLOOP

EXIT WHEN compteur_v = 10 ltltboucleInternegtgt

LOOP EXIT boucleExterne WHEN compteur_v = 100 EXIT boucleInterne WHEN drapeau_v = TRUE

END LOOP boucleInterne END LOOP boucleExterne

23

Interactions avec le serveur Oracle

bull Inclure une requecircte SELECT dans un block PLSQL

bull Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull Modifier des donneacutees dans PLSQL

bull Controcircler les transactions dans PLSQL

bull Deacuteterminer le reacutesultat drsquoune requecircte SELECT dans PLSQL

24

Inclure une requecircte SELECT dans PLSQL

DECLARE

noDept_v NUMBER(2)

lieu_v VARCHAR2(15)

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

ATTENTION la requecircte ne doit retourner que un et un seul tuple Si ce nrsquoest pas le cas les exceptions NO_DATA_FOUND ou TOO_MANY_ROWS sont leveacutees

25

Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull TYPE identifie dynamiquement le type drsquoun attribut drsquoune table

bull ROWTYPEidentifie dynamiquement le type (structureacute) drsquoun tuple drsquoune table

DECLAREdateCommande_v CommandedateCommandeTYPE uneCommande_v CommandeROWTYPE

26

Exemple requecircte SELECT dans PLSQL

DECLARE

noDept_v DepartementnoDeptTYPE

lieu_v DepartementlieuTYPE

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

27

Exemple requecircte SELECT dans PLSQL

DECLARE

sommeSalaires_v EmployesalaireTYPE

noDept_v NUMBER NOT NULL = 10

BEGIN

SELECT SUM(salaire)

INTO sommeSalaires_v

FROM Employe

WHERE noDepartement = noDept_v

END

28

Modifier des donneacutees dans PLSQL

bull Trois commandes du langage de manipulation de donneacutees (LMD) de SQL permettent de modifier une base de donneacutees ndash INSERT

ndash UPDATE

ndash DELETE

29

Modifier des donneacutees dans PLSQL (INSERT)

BEGIN

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (10 lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END

bull Note ndash on peut eacutevidemment utiliser des variables au lieu de simples valeurs

preacutedeacutefinies

30

Modifier des donneacutees dans PLSQL (UPDATE)

DECLAREmajorationSalaire_v EmployesalaireTYPE = 2000

BEGINUPDATE EmployeSET salaire = salaire + majorationSalaire_vWHERE job = lsquoPROGRAMMEURrsquo

END

bull Note ndash contrairement aux affectations PLSQL la clause update utilise le signe

lsquo=lsquo comme opeacuterateur drsquoaffectationndash si une variable a le mecircme nom qursquoun nom drsquoattribut de la table manipuleacutee

dans la clause WHERE le serveur Oracle utilise en prioriteacute lrsquoattribut de table

31

Modifier des donneacutees dans PLSQL (DELETE)

DECLARE

noDept_v EmployenoDeptTYPE = 10

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

END

32

Controcircler les transactions dans PLSQL

bull La premiegravere commande INSERTUPDATEDELETECREATEDROP drsquoun block entamme une nouvelle transaction

bull La fin du block ne termine pas la transactionbull Pour terminer explicitement une transaction utiliser les commandes SQL

ndash COMMIT=gt valide les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

ndash ROLLBACK=gt annule toutes les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

bull Note Une transaction doit ecirctre un ensemble homogegravene de manipulations de la base de donneacutees =gt il faut reacuteflechir agrave tous les endroits ougrave il est leacutegitime de mettre un COMMIT

33

Controcircler les transactions dans PLSQL

DECLARE

noDept_v EmployenoDeptTYPE = 10

majorationSalaire_v EmployesalaireTYPE = 2000

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

COMMIT

UPDATE Employe

SET salaire = salaire + majorationSalaire_v

WHERE job = lsquoPROGRAMMEURrsquo

END

34

Affichage des donneacutees

Option

set serveroutput on cette option permet drsquoactiver lrsquoaffichage des donneacutees dans lrsquooutil sqlplus

Pour afficher un message ou une variable

DBMS_OUTPUTPUT_LINE(lsquomessagersquo)

35

Gestion des exceptionstraitement des erreurs

36

Gestion des exceptions

37

Gestion des exceptions Exemple

38

Gestion des curseurs

bull Neacutecessite lrsquoutilisation de curseurs

Les curseurs sont des zones de travail priveacutees ce sont des zones meacutemoire utiliseacutees pour analyser et interpreacuteter tout ordre SQL

bull Deux types de curseurs

bull les curseurs implicites

Le serveur Oracle utilise des curseurs implicites pour exeacutecuter les requecirctes SQL

bull les curseurs explicites

sont des variables explicitement deacuteclareacutees par le programmeur

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 6: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

6

Variables

1048713 Une variable peut contenir toutes les colonnes drsquoune ligne drsquoune table

bull employe empROWTYPE

bull deacuteclare que la variable employe contiendra une ligne de la table emp

bull Exemple drsquoutilisation

employe empROWTYPE

nom empnomeTYPE

select INTO employe from emp where matr = 900

nom = employenome

employedept = 20

hellip

insert into emp values employe

7

Opeacuterateurs

bull Arithmeacutetique+ -

bull Concateacutenation||

bull Parenthegravese pour controcircler les prioriteacutes des opeacuterations( )

bull Affectation=

bull Comparaison= ltgt lt gt lt= gt= IS NULL LIKE BETWEEN IN

bull LogiqueAND OR NOT

bull Conversion de types

8

Conversions de types de donneacutees

bull Les meacutelanges de types ndash provoquent des erreurs

ndash affectent les performances

bull Fonctions de conversion ndash TO_CHAR

ndash TO_DATE

ndash TO_NUMBER

bull Exemple V = USER || lsquo rsquo || DATE -- Types incompatibles V = USER || lsquo rsquo || TO_CHAR(SYSDATE) -- ok

9

Blocks imbriqueacutes et porteacutee des variables (Exemple)

DECLAREpoids_v NUMBER(3) = 600

message_v VARCHAR2(255) = lsquoProduit 10012rsquo

BEGIN

DECLAREpoids_v NUMBER(3) = 1 message_v VARCHAR2(255) = lsquoProduit 11001rsquo

pays_v VARCHAR2(50) = lsquoEuropersquo

BEGIN

poids_v = poids_v +1

pays_v = lsquoOuest- rsquo || pays_v

END

poids_v = poids_v +1

message_v = mesage_v || lsquo est en stockrsquo

pays_v = lsquoOuest- rsquo || pays_v

END

10

Blocks imbriqueacutes et porteacutee des variables

DECLARE

variable1_v NUMBER(3) = 10

BEGIN

DECLARE

variable2_v NUMBER(3) = 10

BEGIN

END

END

variable1_v

variable1_v variable2_v

variable1_v

11

Blocks imbriqueacutes et porteacutee des variables

DECLARE

variable1_v NUMBER(3) = 10

BEGIN

DECLARE

variable1_v NUMBER(3) = 200

BEGIN

END

END

variable1_v (10)

variable1_v (200)

variable1_v (10)

12

Blocks imbriqueacutes et porteacutee des variables

DECLAREpoids_v NUMBER(3) = 600

message_v VARCHAR2(255) = lsquoProduit 10012rsquo

BEGIN

DECLAREpoids_v NUMBER(3) = 1 -- (poids_v =1)message_v VARCHAR2(255) = lsquoProduit 11001rsquo

pays_v VARCHAR2(50) = lsquoEuropersquo

BEGIN

poids_v = poids_v +1 -- (poids_v = 2)

pays_v = lsquoOuest- rsquo || pays_v

END

poids_v = poids_v +1 -- (poids_v = 601)

message_v = mesage_v || lsquo est en stockrsquo -- (message_v = lsquoProduit 10012 est en stockrsquo)

pays_v = lsquoOuest- rsquo || pays_v -- ILLEGAL

END

13

Exercices

14

Structures de controcircle

bull Branchements conditionnelsndash IF - THEN - END IF

ndash IF - THEN - ELSE - END IF

ndash IF - THEN - ELSIF - END IF

bull Bouclesndash LOOP - END LOOP

ndash FOR - END LOOP

ndash WHILE - END LOOP

ndash Note la commande EXIT permet de sortir de tout type de boucle

ndash Exit when permet de sortir de la boucle selon une condition

15

Structures de controcircle - branchements conditionnels

bull Syntaxe IF ltconditiongt THEN

commandes [ELSIF ltconditiongt THEN

commandes ][ELSE

commandes ]END IF

Note vous pouvez utiliser lrsquoexpression IS NULL dans les conditions

bull Exemples IF nomEmploye_v = lsquoTOTOrsquo THEN

salaire_v = salaire_v 2 END IF

16

Structures de controcircle - branchements conditionnels

IF nomEmploye_v = lsquoTOTOrsquo THENsalaire_v = salaire_v 2

ELSE salaire_v = salaire_v 3

END IF

IF nomEmploye_v = lsquoTOTOrsquo THENsalaire_v = salaire_v 2

ELSIF salaire_v gt 10000 THENsalaire_v = salaire_v 2

ELSE salaire_v = salaire_v 3

END IF

17

Exercices

1- Ecrire un programme plsql qui calcule la somme le produit de deux variables

2- Ecrire un code plSql qui permet de tester le signe drsquoune variable A ( srsquoelle est positive elle reccediloive -1 sinon elle reccediloive +1)

3- Ecrire un code plsql qui donne une appreacuteciation sur une note srsquoelle est lt10 le programme donne a une variable de chaine de caractegraveres la valeur lsquomalrsquo srsquoelle est gt a 10 et lt12 il lui donne la valeur lsquoassez bienrsquo sinon lsquoBienrsquo

18

Structures de controcircle - boucles LOOP

bull Note Sans commande EXIT les boucles LOOP sont infinies

bull Syntaxe LOOP

commandes EXIT [WHEN ltconditiongt]

END LOOP

19

Structures de controcircle - boucles LOOP

bull Exemple

DECLARE

noEmp_v NUMBER (3) = 1

BEGIN

LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1

EXIT WHEN noEmp gt 100

END LOOP

END

20

Structures de controcircle - boucles FOR

bull Syntaxe FOR ltcompteurgt IN ltlimite_infgt ltlimite_supgt

commandes

END LOOP

bull Exemple

DECLARE

noEmp NUMBER (3)

BEGIN

FOR noEmp IN 1 100

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END LOOP

END

21

Structures de controcircle - boucles WHILE

bull Syntaxe WHILE ltconditiongt LOOP

commandes

END LOOP bull Exemple DECLARE

noEmp_v NUMBER (3)BEGIN

noEmp_v = 1WHILE noEmp_v lt= 100 LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1 END LOOP

END

22

Structures de controcircles - remarques sur les boucles

bull Ne pas modifier le compteur drsquoune boucle FORbull Les boucles peuvent ecirctre imbriqueacuteesbull On peut nommer les boucles pour identifier explicitement laquelle de deux

boucles imbriqueacutees se termine ltltboucleExternegtgtLOOP

EXIT WHEN compteur_v = 10 ltltboucleInternegtgt

LOOP EXIT boucleExterne WHEN compteur_v = 100 EXIT boucleInterne WHEN drapeau_v = TRUE

END LOOP boucleInterne END LOOP boucleExterne

23

Interactions avec le serveur Oracle

bull Inclure une requecircte SELECT dans un block PLSQL

bull Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull Modifier des donneacutees dans PLSQL

bull Controcircler les transactions dans PLSQL

bull Deacuteterminer le reacutesultat drsquoune requecircte SELECT dans PLSQL

24

Inclure une requecircte SELECT dans PLSQL

DECLARE

noDept_v NUMBER(2)

lieu_v VARCHAR2(15)

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

ATTENTION la requecircte ne doit retourner que un et un seul tuple Si ce nrsquoest pas le cas les exceptions NO_DATA_FOUND ou TOO_MANY_ROWS sont leveacutees

25

Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull TYPE identifie dynamiquement le type drsquoun attribut drsquoune table

bull ROWTYPEidentifie dynamiquement le type (structureacute) drsquoun tuple drsquoune table

DECLAREdateCommande_v CommandedateCommandeTYPE uneCommande_v CommandeROWTYPE

26

Exemple requecircte SELECT dans PLSQL

DECLARE

noDept_v DepartementnoDeptTYPE

lieu_v DepartementlieuTYPE

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

27

Exemple requecircte SELECT dans PLSQL

DECLARE

sommeSalaires_v EmployesalaireTYPE

noDept_v NUMBER NOT NULL = 10

BEGIN

SELECT SUM(salaire)

INTO sommeSalaires_v

FROM Employe

WHERE noDepartement = noDept_v

END

28

Modifier des donneacutees dans PLSQL

bull Trois commandes du langage de manipulation de donneacutees (LMD) de SQL permettent de modifier une base de donneacutees ndash INSERT

ndash UPDATE

ndash DELETE

29

Modifier des donneacutees dans PLSQL (INSERT)

BEGIN

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (10 lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END

bull Note ndash on peut eacutevidemment utiliser des variables au lieu de simples valeurs

preacutedeacutefinies

30

Modifier des donneacutees dans PLSQL (UPDATE)

DECLAREmajorationSalaire_v EmployesalaireTYPE = 2000

BEGINUPDATE EmployeSET salaire = salaire + majorationSalaire_vWHERE job = lsquoPROGRAMMEURrsquo

END

bull Note ndash contrairement aux affectations PLSQL la clause update utilise le signe

lsquo=lsquo comme opeacuterateur drsquoaffectationndash si une variable a le mecircme nom qursquoun nom drsquoattribut de la table manipuleacutee

dans la clause WHERE le serveur Oracle utilise en prioriteacute lrsquoattribut de table

31

Modifier des donneacutees dans PLSQL (DELETE)

DECLARE

noDept_v EmployenoDeptTYPE = 10

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

END

32

Controcircler les transactions dans PLSQL

bull La premiegravere commande INSERTUPDATEDELETECREATEDROP drsquoun block entamme une nouvelle transaction

bull La fin du block ne termine pas la transactionbull Pour terminer explicitement une transaction utiliser les commandes SQL

ndash COMMIT=gt valide les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

ndash ROLLBACK=gt annule toutes les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

bull Note Une transaction doit ecirctre un ensemble homogegravene de manipulations de la base de donneacutees =gt il faut reacuteflechir agrave tous les endroits ougrave il est leacutegitime de mettre un COMMIT

33

Controcircler les transactions dans PLSQL

DECLARE

noDept_v EmployenoDeptTYPE = 10

majorationSalaire_v EmployesalaireTYPE = 2000

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

COMMIT

UPDATE Employe

SET salaire = salaire + majorationSalaire_v

WHERE job = lsquoPROGRAMMEURrsquo

END

34

Affichage des donneacutees

Option

set serveroutput on cette option permet drsquoactiver lrsquoaffichage des donneacutees dans lrsquooutil sqlplus

Pour afficher un message ou une variable

DBMS_OUTPUTPUT_LINE(lsquomessagersquo)

35

Gestion des exceptionstraitement des erreurs

36

Gestion des exceptions

37

Gestion des exceptions Exemple

38

Gestion des curseurs

bull Neacutecessite lrsquoutilisation de curseurs

Les curseurs sont des zones de travail priveacutees ce sont des zones meacutemoire utiliseacutees pour analyser et interpreacuteter tout ordre SQL

bull Deux types de curseurs

bull les curseurs implicites

Le serveur Oracle utilise des curseurs implicites pour exeacutecuter les requecirctes SQL

bull les curseurs explicites

sont des variables explicitement deacuteclareacutees par le programmeur

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 7: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

7

Opeacuterateurs

bull Arithmeacutetique+ -

bull Concateacutenation||

bull Parenthegravese pour controcircler les prioriteacutes des opeacuterations( )

bull Affectation=

bull Comparaison= ltgt lt gt lt= gt= IS NULL LIKE BETWEEN IN

bull LogiqueAND OR NOT

bull Conversion de types

8

Conversions de types de donneacutees

bull Les meacutelanges de types ndash provoquent des erreurs

ndash affectent les performances

bull Fonctions de conversion ndash TO_CHAR

ndash TO_DATE

ndash TO_NUMBER

bull Exemple V = USER || lsquo rsquo || DATE -- Types incompatibles V = USER || lsquo rsquo || TO_CHAR(SYSDATE) -- ok

9

Blocks imbriqueacutes et porteacutee des variables (Exemple)

DECLAREpoids_v NUMBER(3) = 600

message_v VARCHAR2(255) = lsquoProduit 10012rsquo

BEGIN

DECLAREpoids_v NUMBER(3) = 1 message_v VARCHAR2(255) = lsquoProduit 11001rsquo

pays_v VARCHAR2(50) = lsquoEuropersquo

BEGIN

poids_v = poids_v +1

pays_v = lsquoOuest- rsquo || pays_v

END

poids_v = poids_v +1

message_v = mesage_v || lsquo est en stockrsquo

pays_v = lsquoOuest- rsquo || pays_v

END

10

Blocks imbriqueacutes et porteacutee des variables

DECLARE

variable1_v NUMBER(3) = 10

BEGIN

DECLARE

variable2_v NUMBER(3) = 10

BEGIN

END

END

variable1_v

variable1_v variable2_v

variable1_v

11

Blocks imbriqueacutes et porteacutee des variables

DECLARE

variable1_v NUMBER(3) = 10

BEGIN

DECLARE

variable1_v NUMBER(3) = 200

BEGIN

END

END

variable1_v (10)

variable1_v (200)

variable1_v (10)

12

Blocks imbriqueacutes et porteacutee des variables

DECLAREpoids_v NUMBER(3) = 600

message_v VARCHAR2(255) = lsquoProduit 10012rsquo

BEGIN

DECLAREpoids_v NUMBER(3) = 1 -- (poids_v =1)message_v VARCHAR2(255) = lsquoProduit 11001rsquo

pays_v VARCHAR2(50) = lsquoEuropersquo

BEGIN

poids_v = poids_v +1 -- (poids_v = 2)

pays_v = lsquoOuest- rsquo || pays_v

END

poids_v = poids_v +1 -- (poids_v = 601)

message_v = mesage_v || lsquo est en stockrsquo -- (message_v = lsquoProduit 10012 est en stockrsquo)

pays_v = lsquoOuest- rsquo || pays_v -- ILLEGAL

END

13

Exercices

14

Structures de controcircle

bull Branchements conditionnelsndash IF - THEN - END IF

ndash IF - THEN - ELSE - END IF

ndash IF - THEN - ELSIF - END IF

bull Bouclesndash LOOP - END LOOP

ndash FOR - END LOOP

ndash WHILE - END LOOP

ndash Note la commande EXIT permet de sortir de tout type de boucle

ndash Exit when permet de sortir de la boucle selon une condition

15

Structures de controcircle - branchements conditionnels

bull Syntaxe IF ltconditiongt THEN

commandes [ELSIF ltconditiongt THEN

commandes ][ELSE

commandes ]END IF

Note vous pouvez utiliser lrsquoexpression IS NULL dans les conditions

bull Exemples IF nomEmploye_v = lsquoTOTOrsquo THEN

salaire_v = salaire_v 2 END IF

16

Structures de controcircle - branchements conditionnels

IF nomEmploye_v = lsquoTOTOrsquo THENsalaire_v = salaire_v 2

ELSE salaire_v = salaire_v 3

END IF

IF nomEmploye_v = lsquoTOTOrsquo THENsalaire_v = salaire_v 2

ELSIF salaire_v gt 10000 THENsalaire_v = salaire_v 2

ELSE salaire_v = salaire_v 3

END IF

17

Exercices

1- Ecrire un programme plsql qui calcule la somme le produit de deux variables

2- Ecrire un code plSql qui permet de tester le signe drsquoune variable A ( srsquoelle est positive elle reccediloive -1 sinon elle reccediloive +1)

3- Ecrire un code plsql qui donne une appreacuteciation sur une note srsquoelle est lt10 le programme donne a une variable de chaine de caractegraveres la valeur lsquomalrsquo srsquoelle est gt a 10 et lt12 il lui donne la valeur lsquoassez bienrsquo sinon lsquoBienrsquo

18

Structures de controcircle - boucles LOOP

bull Note Sans commande EXIT les boucles LOOP sont infinies

bull Syntaxe LOOP

commandes EXIT [WHEN ltconditiongt]

END LOOP

19

Structures de controcircle - boucles LOOP

bull Exemple

DECLARE

noEmp_v NUMBER (3) = 1

BEGIN

LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1

EXIT WHEN noEmp gt 100

END LOOP

END

20

Structures de controcircle - boucles FOR

bull Syntaxe FOR ltcompteurgt IN ltlimite_infgt ltlimite_supgt

commandes

END LOOP

bull Exemple

DECLARE

noEmp NUMBER (3)

BEGIN

FOR noEmp IN 1 100

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END LOOP

END

21

Structures de controcircle - boucles WHILE

bull Syntaxe WHILE ltconditiongt LOOP

commandes

END LOOP bull Exemple DECLARE

noEmp_v NUMBER (3)BEGIN

noEmp_v = 1WHILE noEmp_v lt= 100 LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1 END LOOP

END

22

Structures de controcircles - remarques sur les boucles

bull Ne pas modifier le compteur drsquoune boucle FORbull Les boucles peuvent ecirctre imbriqueacuteesbull On peut nommer les boucles pour identifier explicitement laquelle de deux

boucles imbriqueacutees se termine ltltboucleExternegtgtLOOP

EXIT WHEN compteur_v = 10 ltltboucleInternegtgt

LOOP EXIT boucleExterne WHEN compteur_v = 100 EXIT boucleInterne WHEN drapeau_v = TRUE

END LOOP boucleInterne END LOOP boucleExterne

23

Interactions avec le serveur Oracle

bull Inclure une requecircte SELECT dans un block PLSQL

bull Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull Modifier des donneacutees dans PLSQL

bull Controcircler les transactions dans PLSQL

bull Deacuteterminer le reacutesultat drsquoune requecircte SELECT dans PLSQL

24

Inclure une requecircte SELECT dans PLSQL

DECLARE

noDept_v NUMBER(2)

lieu_v VARCHAR2(15)

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

ATTENTION la requecircte ne doit retourner que un et un seul tuple Si ce nrsquoest pas le cas les exceptions NO_DATA_FOUND ou TOO_MANY_ROWS sont leveacutees

25

Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull TYPE identifie dynamiquement le type drsquoun attribut drsquoune table

bull ROWTYPEidentifie dynamiquement le type (structureacute) drsquoun tuple drsquoune table

DECLAREdateCommande_v CommandedateCommandeTYPE uneCommande_v CommandeROWTYPE

26

Exemple requecircte SELECT dans PLSQL

DECLARE

noDept_v DepartementnoDeptTYPE

lieu_v DepartementlieuTYPE

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

27

Exemple requecircte SELECT dans PLSQL

DECLARE

sommeSalaires_v EmployesalaireTYPE

noDept_v NUMBER NOT NULL = 10

BEGIN

SELECT SUM(salaire)

INTO sommeSalaires_v

FROM Employe

WHERE noDepartement = noDept_v

END

28

Modifier des donneacutees dans PLSQL

bull Trois commandes du langage de manipulation de donneacutees (LMD) de SQL permettent de modifier une base de donneacutees ndash INSERT

ndash UPDATE

ndash DELETE

29

Modifier des donneacutees dans PLSQL (INSERT)

BEGIN

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (10 lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END

bull Note ndash on peut eacutevidemment utiliser des variables au lieu de simples valeurs

preacutedeacutefinies

30

Modifier des donneacutees dans PLSQL (UPDATE)

DECLAREmajorationSalaire_v EmployesalaireTYPE = 2000

BEGINUPDATE EmployeSET salaire = salaire + majorationSalaire_vWHERE job = lsquoPROGRAMMEURrsquo

END

bull Note ndash contrairement aux affectations PLSQL la clause update utilise le signe

lsquo=lsquo comme opeacuterateur drsquoaffectationndash si une variable a le mecircme nom qursquoun nom drsquoattribut de la table manipuleacutee

dans la clause WHERE le serveur Oracle utilise en prioriteacute lrsquoattribut de table

31

Modifier des donneacutees dans PLSQL (DELETE)

DECLARE

noDept_v EmployenoDeptTYPE = 10

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

END

32

Controcircler les transactions dans PLSQL

bull La premiegravere commande INSERTUPDATEDELETECREATEDROP drsquoun block entamme une nouvelle transaction

bull La fin du block ne termine pas la transactionbull Pour terminer explicitement une transaction utiliser les commandes SQL

ndash COMMIT=gt valide les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

ndash ROLLBACK=gt annule toutes les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

bull Note Une transaction doit ecirctre un ensemble homogegravene de manipulations de la base de donneacutees =gt il faut reacuteflechir agrave tous les endroits ougrave il est leacutegitime de mettre un COMMIT

33

Controcircler les transactions dans PLSQL

DECLARE

noDept_v EmployenoDeptTYPE = 10

majorationSalaire_v EmployesalaireTYPE = 2000

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

COMMIT

UPDATE Employe

SET salaire = salaire + majorationSalaire_v

WHERE job = lsquoPROGRAMMEURrsquo

END

34

Affichage des donneacutees

Option

set serveroutput on cette option permet drsquoactiver lrsquoaffichage des donneacutees dans lrsquooutil sqlplus

Pour afficher un message ou une variable

DBMS_OUTPUTPUT_LINE(lsquomessagersquo)

35

Gestion des exceptionstraitement des erreurs

36

Gestion des exceptions

37

Gestion des exceptions Exemple

38

Gestion des curseurs

bull Neacutecessite lrsquoutilisation de curseurs

Les curseurs sont des zones de travail priveacutees ce sont des zones meacutemoire utiliseacutees pour analyser et interpreacuteter tout ordre SQL

bull Deux types de curseurs

bull les curseurs implicites

Le serveur Oracle utilise des curseurs implicites pour exeacutecuter les requecirctes SQL

bull les curseurs explicites

sont des variables explicitement deacuteclareacutees par le programmeur

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 8: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

8

Conversions de types de donneacutees

bull Les meacutelanges de types ndash provoquent des erreurs

ndash affectent les performances

bull Fonctions de conversion ndash TO_CHAR

ndash TO_DATE

ndash TO_NUMBER

bull Exemple V = USER || lsquo rsquo || DATE -- Types incompatibles V = USER || lsquo rsquo || TO_CHAR(SYSDATE) -- ok

9

Blocks imbriqueacutes et porteacutee des variables (Exemple)

DECLAREpoids_v NUMBER(3) = 600

message_v VARCHAR2(255) = lsquoProduit 10012rsquo

BEGIN

DECLAREpoids_v NUMBER(3) = 1 message_v VARCHAR2(255) = lsquoProduit 11001rsquo

pays_v VARCHAR2(50) = lsquoEuropersquo

BEGIN

poids_v = poids_v +1

pays_v = lsquoOuest- rsquo || pays_v

END

poids_v = poids_v +1

message_v = mesage_v || lsquo est en stockrsquo

pays_v = lsquoOuest- rsquo || pays_v

END

10

Blocks imbriqueacutes et porteacutee des variables

DECLARE

variable1_v NUMBER(3) = 10

BEGIN

DECLARE

variable2_v NUMBER(3) = 10

BEGIN

END

END

variable1_v

variable1_v variable2_v

variable1_v

11

Blocks imbriqueacutes et porteacutee des variables

DECLARE

variable1_v NUMBER(3) = 10

BEGIN

DECLARE

variable1_v NUMBER(3) = 200

BEGIN

END

END

variable1_v (10)

variable1_v (200)

variable1_v (10)

12

Blocks imbriqueacutes et porteacutee des variables

DECLAREpoids_v NUMBER(3) = 600

message_v VARCHAR2(255) = lsquoProduit 10012rsquo

BEGIN

DECLAREpoids_v NUMBER(3) = 1 -- (poids_v =1)message_v VARCHAR2(255) = lsquoProduit 11001rsquo

pays_v VARCHAR2(50) = lsquoEuropersquo

BEGIN

poids_v = poids_v +1 -- (poids_v = 2)

pays_v = lsquoOuest- rsquo || pays_v

END

poids_v = poids_v +1 -- (poids_v = 601)

message_v = mesage_v || lsquo est en stockrsquo -- (message_v = lsquoProduit 10012 est en stockrsquo)

pays_v = lsquoOuest- rsquo || pays_v -- ILLEGAL

END

13

Exercices

14

Structures de controcircle

bull Branchements conditionnelsndash IF - THEN - END IF

ndash IF - THEN - ELSE - END IF

ndash IF - THEN - ELSIF - END IF

bull Bouclesndash LOOP - END LOOP

ndash FOR - END LOOP

ndash WHILE - END LOOP

ndash Note la commande EXIT permet de sortir de tout type de boucle

ndash Exit when permet de sortir de la boucle selon une condition

15

Structures de controcircle - branchements conditionnels

bull Syntaxe IF ltconditiongt THEN

commandes [ELSIF ltconditiongt THEN

commandes ][ELSE

commandes ]END IF

Note vous pouvez utiliser lrsquoexpression IS NULL dans les conditions

bull Exemples IF nomEmploye_v = lsquoTOTOrsquo THEN

salaire_v = salaire_v 2 END IF

16

Structures de controcircle - branchements conditionnels

IF nomEmploye_v = lsquoTOTOrsquo THENsalaire_v = salaire_v 2

ELSE salaire_v = salaire_v 3

END IF

IF nomEmploye_v = lsquoTOTOrsquo THENsalaire_v = salaire_v 2

ELSIF salaire_v gt 10000 THENsalaire_v = salaire_v 2

ELSE salaire_v = salaire_v 3

END IF

17

Exercices

1- Ecrire un programme plsql qui calcule la somme le produit de deux variables

2- Ecrire un code plSql qui permet de tester le signe drsquoune variable A ( srsquoelle est positive elle reccediloive -1 sinon elle reccediloive +1)

3- Ecrire un code plsql qui donne une appreacuteciation sur une note srsquoelle est lt10 le programme donne a une variable de chaine de caractegraveres la valeur lsquomalrsquo srsquoelle est gt a 10 et lt12 il lui donne la valeur lsquoassez bienrsquo sinon lsquoBienrsquo

18

Structures de controcircle - boucles LOOP

bull Note Sans commande EXIT les boucles LOOP sont infinies

bull Syntaxe LOOP

commandes EXIT [WHEN ltconditiongt]

END LOOP

19

Structures de controcircle - boucles LOOP

bull Exemple

DECLARE

noEmp_v NUMBER (3) = 1

BEGIN

LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1

EXIT WHEN noEmp gt 100

END LOOP

END

20

Structures de controcircle - boucles FOR

bull Syntaxe FOR ltcompteurgt IN ltlimite_infgt ltlimite_supgt

commandes

END LOOP

bull Exemple

DECLARE

noEmp NUMBER (3)

BEGIN

FOR noEmp IN 1 100

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END LOOP

END

21

Structures de controcircle - boucles WHILE

bull Syntaxe WHILE ltconditiongt LOOP

commandes

END LOOP bull Exemple DECLARE

noEmp_v NUMBER (3)BEGIN

noEmp_v = 1WHILE noEmp_v lt= 100 LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1 END LOOP

END

22

Structures de controcircles - remarques sur les boucles

bull Ne pas modifier le compteur drsquoune boucle FORbull Les boucles peuvent ecirctre imbriqueacuteesbull On peut nommer les boucles pour identifier explicitement laquelle de deux

boucles imbriqueacutees se termine ltltboucleExternegtgtLOOP

EXIT WHEN compteur_v = 10 ltltboucleInternegtgt

LOOP EXIT boucleExterne WHEN compteur_v = 100 EXIT boucleInterne WHEN drapeau_v = TRUE

END LOOP boucleInterne END LOOP boucleExterne

23

Interactions avec le serveur Oracle

bull Inclure une requecircte SELECT dans un block PLSQL

bull Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull Modifier des donneacutees dans PLSQL

bull Controcircler les transactions dans PLSQL

bull Deacuteterminer le reacutesultat drsquoune requecircte SELECT dans PLSQL

24

Inclure une requecircte SELECT dans PLSQL

DECLARE

noDept_v NUMBER(2)

lieu_v VARCHAR2(15)

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

ATTENTION la requecircte ne doit retourner que un et un seul tuple Si ce nrsquoest pas le cas les exceptions NO_DATA_FOUND ou TOO_MANY_ROWS sont leveacutees

25

Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull TYPE identifie dynamiquement le type drsquoun attribut drsquoune table

bull ROWTYPEidentifie dynamiquement le type (structureacute) drsquoun tuple drsquoune table

DECLAREdateCommande_v CommandedateCommandeTYPE uneCommande_v CommandeROWTYPE

26

Exemple requecircte SELECT dans PLSQL

DECLARE

noDept_v DepartementnoDeptTYPE

lieu_v DepartementlieuTYPE

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

27

Exemple requecircte SELECT dans PLSQL

DECLARE

sommeSalaires_v EmployesalaireTYPE

noDept_v NUMBER NOT NULL = 10

BEGIN

SELECT SUM(salaire)

INTO sommeSalaires_v

FROM Employe

WHERE noDepartement = noDept_v

END

28

Modifier des donneacutees dans PLSQL

bull Trois commandes du langage de manipulation de donneacutees (LMD) de SQL permettent de modifier une base de donneacutees ndash INSERT

ndash UPDATE

ndash DELETE

29

Modifier des donneacutees dans PLSQL (INSERT)

BEGIN

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (10 lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END

bull Note ndash on peut eacutevidemment utiliser des variables au lieu de simples valeurs

preacutedeacutefinies

30

Modifier des donneacutees dans PLSQL (UPDATE)

DECLAREmajorationSalaire_v EmployesalaireTYPE = 2000

BEGINUPDATE EmployeSET salaire = salaire + majorationSalaire_vWHERE job = lsquoPROGRAMMEURrsquo

END

bull Note ndash contrairement aux affectations PLSQL la clause update utilise le signe

lsquo=lsquo comme opeacuterateur drsquoaffectationndash si une variable a le mecircme nom qursquoun nom drsquoattribut de la table manipuleacutee

dans la clause WHERE le serveur Oracle utilise en prioriteacute lrsquoattribut de table

31

Modifier des donneacutees dans PLSQL (DELETE)

DECLARE

noDept_v EmployenoDeptTYPE = 10

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

END

32

Controcircler les transactions dans PLSQL

bull La premiegravere commande INSERTUPDATEDELETECREATEDROP drsquoun block entamme une nouvelle transaction

bull La fin du block ne termine pas la transactionbull Pour terminer explicitement une transaction utiliser les commandes SQL

ndash COMMIT=gt valide les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

ndash ROLLBACK=gt annule toutes les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

bull Note Une transaction doit ecirctre un ensemble homogegravene de manipulations de la base de donneacutees =gt il faut reacuteflechir agrave tous les endroits ougrave il est leacutegitime de mettre un COMMIT

33

Controcircler les transactions dans PLSQL

DECLARE

noDept_v EmployenoDeptTYPE = 10

majorationSalaire_v EmployesalaireTYPE = 2000

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

COMMIT

UPDATE Employe

SET salaire = salaire + majorationSalaire_v

WHERE job = lsquoPROGRAMMEURrsquo

END

34

Affichage des donneacutees

Option

set serveroutput on cette option permet drsquoactiver lrsquoaffichage des donneacutees dans lrsquooutil sqlplus

Pour afficher un message ou une variable

DBMS_OUTPUTPUT_LINE(lsquomessagersquo)

35

Gestion des exceptionstraitement des erreurs

36

Gestion des exceptions

37

Gestion des exceptions Exemple

38

Gestion des curseurs

bull Neacutecessite lrsquoutilisation de curseurs

Les curseurs sont des zones de travail priveacutees ce sont des zones meacutemoire utiliseacutees pour analyser et interpreacuteter tout ordre SQL

bull Deux types de curseurs

bull les curseurs implicites

Le serveur Oracle utilise des curseurs implicites pour exeacutecuter les requecirctes SQL

bull les curseurs explicites

sont des variables explicitement deacuteclareacutees par le programmeur

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 9: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

9

Blocks imbriqueacutes et porteacutee des variables (Exemple)

DECLAREpoids_v NUMBER(3) = 600

message_v VARCHAR2(255) = lsquoProduit 10012rsquo

BEGIN

DECLAREpoids_v NUMBER(3) = 1 message_v VARCHAR2(255) = lsquoProduit 11001rsquo

pays_v VARCHAR2(50) = lsquoEuropersquo

BEGIN

poids_v = poids_v +1

pays_v = lsquoOuest- rsquo || pays_v

END

poids_v = poids_v +1

message_v = mesage_v || lsquo est en stockrsquo

pays_v = lsquoOuest- rsquo || pays_v

END

10

Blocks imbriqueacutes et porteacutee des variables

DECLARE

variable1_v NUMBER(3) = 10

BEGIN

DECLARE

variable2_v NUMBER(3) = 10

BEGIN

END

END

variable1_v

variable1_v variable2_v

variable1_v

11

Blocks imbriqueacutes et porteacutee des variables

DECLARE

variable1_v NUMBER(3) = 10

BEGIN

DECLARE

variable1_v NUMBER(3) = 200

BEGIN

END

END

variable1_v (10)

variable1_v (200)

variable1_v (10)

12

Blocks imbriqueacutes et porteacutee des variables

DECLAREpoids_v NUMBER(3) = 600

message_v VARCHAR2(255) = lsquoProduit 10012rsquo

BEGIN

DECLAREpoids_v NUMBER(3) = 1 -- (poids_v =1)message_v VARCHAR2(255) = lsquoProduit 11001rsquo

pays_v VARCHAR2(50) = lsquoEuropersquo

BEGIN

poids_v = poids_v +1 -- (poids_v = 2)

pays_v = lsquoOuest- rsquo || pays_v

END

poids_v = poids_v +1 -- (poids_v = 601)

message_v = mesage_v || lsquo est en stockrsquo -- (message_v = lsquoProduit 10012 est en stockrsquo)

pays_v = lsquoOuest- rsquo || pays_v -- ILLEGAL

END

13

Exercices

14

Structures de controcircle

bull Branchements conditionnelsndash IF - THEN - END IF

ndash IF - THEN - ELSE - END IF

ndash IF - THEN - ELSIF - END IF

bull Bouclesndash LOOP - END LOOP

ndash FOR - END LOOP

ndash WHILE - END LOOP

ndash Note la commande EXIT permet de sortir de tout type de boucle

ndash Exit when permet de sortir de la boucle selon une condition

15

Structures de controcircle - branchements conditionnels

bull Syntaxe IF ltconditiongt THEN

commandes [ELSIF ltconditiongt THEN

commandes ][ELSE

commandes ]END IF

Note vous pouvez utiliser lrsquoexpression IS NULL dans les conditions

bull Exemples IF nomEmploye_v = lsquoTOTOrsquo THEN

salaire_v = salaire_v 2 END IF

16

Structures de controcircle - branchements conditionnels

IF nomEmploye_v = lsquoTOTOrsquo THENsalaire_v = salaire_v 2

ELSE salaire_v = salaire_v 3

END IF

IF nomEmploye_v = lsquoTOTOrsquo THENsalaire_v = salaire_v 2

ELSIF salaire_v gt 10000 THENsalaire_v = salaire_v 2

ELSE salaire_v = salaire_v 3

END IF

17

Exercices

1- Ecrire un programme plsql qui calcule la somme le produit de deux variables

2- Ecrire un code plSql qui permet de tester le signe drsquoune variable A ( srsquoelle est positive elle reccediloive -1 sinon elle reccediloive +1)

3- Ecrire un code plsql qui donne une appreacuteciation sur une note srsquoelle est lt10 le programme donne a une variable de chaine de caractegraveres la valeur lsquomalrsquo srsquoelle est gt a 10 et lt12 il lui donne la valeur lsquoassez bienrsquo sinon lsquoBienrsquo

18

Structures de controcircle - boucles LOOP

bull Note Sans commande EXIT les boucles LOOP sont infinies

bull Syntaxe LOOP

commandes EXIT [WHEN ltconditiongt]

END LOOP

19

Structures de controcircle - boucles LOOP

bull Exemple

DECLARE

noEmp_v NUMBER (3) = 1

BEGIN

LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1

EXIT WHEN noEmp gt 100

END LOOP

END

20

Structures de controcircle - boucles FOR

bull Syntaxe FOR ltcompteurgt IN ltlimite_infgt ltlimite_supgt

commandes

END LOOP

bull Exemple

DECLARE

noEmp NUMBER (3)

BEGIN

FOR noEmp IN 1 100

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END LOOP

END

21

Structures de controcircle - boucles WHILE

bull Syntaxe WHILE ltconditiongt LOOP

commandes

END LOOP bull Exemple DECLARE

noEmp_v NUMBER (3)BEGIN

noEmp_v = 1WHILE noEmp_v lt= 100 LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1 END LOOP

END

22

Structures de controcircles - remarques sur les boucles

bull Ne pas modifier le compteur drsquoune boucle FORbull Les boucles peuvent ecirctre imbriqueacuteesbull On peut nommer les boucles pour identifier explicitement laquelle de deux

boucles imbriqueacutees se termine ltltboucleExternegtgtLOOP

EXIT WHEN compteur_v = 10 ltltboucleInternegtgt

LOOP EXIT boucleExterne WHEN compteur_v = 100 EXIT boucleInterne WHEN drapeau_v = TRUE

END LOOP boucleInterne END LOOP boucleExterne

23

Interactions avec le serveur Oracle

bull Inclure une requecircte SELECT dans un block PLSQL

bull Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull Modifier des donneacutees dans PLSQL

bull Controcircler les transactions dans PLSQL

bull Deacuteterminer le reacutesultat drsquoune requecircte SELECT dans PLSQL

24

Inclure une requecircte SELECT dans PLSQL

DECLARE

noDept_v NUMBER(2)

lieu_v VARCHAR2(15)

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

ATTENTION la requecircte ne doit retourner que un et un seul tuple Si ce nrsquoest pas le cas les exceptions NO_DATA_FOUND ou TOO_MANY_ROWS sont leveacutees

25

Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull TYPE identifie dynamiquement le type drsquoun attribut drsquoune table

bull ROWTYPEidentifie dynamiquement le type (structureacute) drsquoun tuple drsquoune table

DECLAREdateCommande_v CommandedateCommandeTYPE uneCommande_v CommandeROWTYPE

26

Exemple requecircte SELECT dans PLSQL

DECLARE

noDept_v DepartementnoDeptTYPE

lieu_v DepartementlieuTYPE

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

27

Exemple requecircte SELECT dans PLSQL

DECLARE

sommeSalaires_v EmployesalaireTYPE

noDept_v NUMBER NOT NULL = 10

BEGIN

SELECT SUM(salaire)

INTO sommeSalaires_v

FROM Employe

WHERE noDepartement = noDept_v

END

28

Modifier des donneacutees dans PLSQL

bull Trois commandes du langage de manipulation de donneacutees (LMD) de SQL permettent de modifier une base de donneacutees ndash INSERT

ndash UPDATE

ndash DELETE

29

Modifier des donneacutees dans PLSQL (INSERT)

BEGIN

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (10 lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END

bull Note ndash on peut eacutevidemment utiliser des variables au lieu de simples valeurs

preacutedeacutefinies

30

Modifier des donneacutees dans PLSQL (UPDATE)

DECLAREmajorationSalaire_v EmployesalaireTYPE = 2000

BEGINUPDATE EmployeSET salaire = salaire + majorationSalaire_vWHERE job = lsquoPROGRAMMEURrsquo

END

bull Note ndash contrairement aux affectations PLSQL la clause update utilise le signe

lsquo=lsquo comme opeacuterateur drsquoaffectationndash si une variable a le mecircme nom qursquoun nom drsquoattribut de la table manipuleacutee

dans la clause WHERE le serveur Oracle utilise en prioriteacute lrsquoattribut de table

31

Modifier des donneacutees dans PLSQL (DELETE)

DECLARE

noDept_v EmployenoDeptTYPE = 10

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

END

32

Controcircler les transactions dans PLSQL

bull La premiegravere commande INSERTUPDATEDELETECREATEDROP drsquoun block entamme une nouvelle transaction

bull La fin du block ne termine pas la transactionbull Pour terminer explicitement une transaction utiliser les commandes SQL

ndash COMMIT=gt valide les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

ndash ROLLBACK=gt annule toutes les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

bull Note Une transaction doit ecirctre un ensemble homogegravene de manipulations de la base de donneacutees =gt il faut reacuteflechir agrave tous les endroits ougrave il est leacutegitime de mettre un COMMIT

33

Controcircler les transactions dans PLSQL

DECLARE

noDept_v EmployenoDeptTYPE = 10

majorationSalaire_v EmployesalaireTYPE = 2000

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

COMMIT

UPDATE Employe

SET salaire = salaire + majorationSalaire_v

WHERE job = lsquoPROGRAMMEURrsquo

END

34

Affichage des donneacutees

Option

set serveroutput on cette option permet drsquoactiver lrsquoaffichage des donneacutees dans lrsquooutil sqlplus

Pour afficher un message ou une variable

DBMS_OUTPUTPUT_LINE(lsquomessagersquo)

35

Gestion des exceptionstraitement des erreurs

36

Gestion des exceptions

37

Gestion des exceptions Exemple

38

Gestion des curseurs

bull Neacutecessite lrsquoutilisation de curseurs

Les curseurs sont des zones de travail priveacutees ce sont des zones meacutemoire utiliseacutees pour analyser et interpreacuteter tout ordre SQL

bull Deux types de curseurs

bull les curseurs implicites

Le serveur Oracle utilise des curseurs implicites pour exeacutecuter les requecirctes SQL

bull les curseurs explicites

sont des variables explicitement deacuteclareacutees par le programmeur

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 10: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

10

Blocks imbriqueacutes et porteacutee des variables

DECLARE

variable1_v NUMBER(3) = 10

BEGIN

DECLARE

variable2_v NUMBER(3) = 10

BEGIN

END

END

variable1_v

variable1_v variable2_v

variable1_v

11

Blocks imbriqueacutes et porteacutee des variables

DECLARE

variable1_v NUMBER(3) = 10

BEGIN

DECLARE

variable1_v NUMBER(3) = 200

BEGIN

END

END

variable1_v (10)

variable1_v (200)

variable1_v (10)

12

Blocks imbriqueacutes et porteacutee des variables

DECLAREpoids_v NUMBER(3) = 600

message_v VARCHAR2(255) = lsquoProduit 10012rsquo

BEGIN

DECLAREpoids_v NUMBER(3) = 1 -- (poids_v =1)message_v VARCHAR2(255) = lsquoProduit 11001rsquo

pays_v VARCHAR2(50) = lsquoEuropersquo

BEGIN

poids_v = poids_v +1 -- (poids_v = 2)

pays_v = lsquoOuest- rsquo || pays_v

END

poids_v = poids_v +1 -- (poids_v = 601)

message_v = mesage_v || lsquo est en stockrsquo -- (message_v = lsquoProduit 10012 est en stockrsquo)

pays_v = lsquoOuest- rsquo || pays_v -- ILLEGAL

END

13

Exercices

14

Structures de controcircle

bull Branchements conditionnelsndash IF - THEN - END IF

ndash IF - THEN - ELSE - END IF

ndash IF - THEN - ELSIF - END IF

bull Bouclesndash LOOP - END LOOP

ndash FOR - END LOOP

ndash WHILE - END LOOP

ndash Note la commande EXIT permet de sortir de tout type de boucle

ndash Exit when permet de sortir de la boucle selon une condition

15

Structures de controcircle - branchements conditionnels

bull Syntaxe IF ltconditiongt THEN

commandes [ELSIF ltconditiongt THEN

commandes ][ELSE

commandes ]END IF

Note vous pouvez utiliser lrsquoexpression IS NULL dans les conditions

bull Exemples IF nomEmploye_v = lsquoTOTOrsquo THEN

salaire_v = salaire_v 2 END IF

16

Structures de controcircle - branchements conditionnels

IF nomEmploye_v = lsquoTOTOrsquo THENsalaire_v = salaire_v 2

ELSE salaire_v = salaire_v 3

END IF

IF nomEmploye_v = lsquoTOTOrsquo THENsalaire_v = salaire_v 2

ELSIF salaire_v gt 10000 THENsalaire_v = salaire_v 2

ELSE salaire_v = salaire_v 3

END IF

17

Exercices

1- Ecrire un programme plsql qui calcule la somme le produit de deux variables

2- Ecrire un code plSql qui permet de tester le signe drsquoune variable A ( srsquoelle est positive elle reccediloive -1 sinon elle reccediloive +1)

3- Ecrire un code plsql qui donne une appreacuteciation sur une note srsquoelle est lt10 le programme donne a une variable de chaine de caractegraveres la valeur lsquomalrsquo srsquoelle est gt a 10 et lt12 il lui donne la valeur lsquoassez bienrsquo sinon lsquoBienrsquo

18

Structures de controcircle - boucles LOOP

bull Note Sans commande EXIT les boucles LOOP sont infinies

bull Syntaxe LOOP

commandes EXIT [WHEN ltconditiongt]

END LOOP

19

Structures de controcircle - boucles LOOP

bull Exemple

DECLARE

noEmp_v NUMBER (3) = 1

BEGIN

LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1

EXIT WHEN noEmp gt 100

END LOOP

END

20

Structures de controcircle - boucles FOR

bull Syntaxe FOR ltcompteurgt IN ltlimite_infgt ltlimite_supgt

commandes

END LOOP

bull Exemple

DECLARE

noEmp NUMBER (3)

BEGIN

FOR noEmp IN 1 100

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END LOOP

END

21

Structures de controcircle - boucles WHILE

bull Syntaxe WHILE ltconditiongt LOOP

commandes

END LOOP bull Exemple DECLARE

noEmp_v NUMBER (3)BEGIN

noEmp_v = 1WHILE noEmp_v lt= 100 LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1 END LOOP

END

22

Structures de controcircles - remarques sur les boucles

bull Ne pas modifier le compteur drsquoune boucle FORbull Les boucles peuvent ecirctre imbriqueacuteesbull On peut nommer les boucles pour identifier explicitement laquelle de deux

boucles imbriqueacutees se termine ltltboucleExternegtgtLOOP

EXIT WHEN compteur_v = 10 ltltboucleInternegtgt

LOOP EXIT boucleExterne WHEN compteur_v = 100 EXIT boucleInterne WHEN drapeau_v = TRUE

END LOOP boucleInterne END LOOP boucleExterne

23

Interactions avec le serveur Oracle

bull Inclure une requecircte SELECT dans un block PLSQL

bull Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull Modifier des donneacutees dans PLSQL

bull Controcircler les transactions dans PLSQL

bull Deacuteterminer le reacutesultat drsquoune requecircte SELECT dans PLSQL

24

Inclure une requecircte SELECT dans PLSQL

DECLARE

noDept_v NUMBER(2)

lieu_v VARCHAR2(15)

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

ATTENTION la requecircte ne doit retourner que un et un seul tuple Si ce nrsquoest pas le cas les exceptions NO_DATA_FOUND ou TOO_MANY_ROWS sont leveacutees

25

Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull TYPE identifie dynamiquement le type drsquoun attribut drsquoune table

bull ROWTYPEidentifie dynamiquement le type (structureacute) drsquoun tuple drsquoune table

DECLAREdateCommande_v CommandedateCommandeTYPE uneCommande_v CommandeROWTYPE

26

Exemple requecircte SELECT dans PLSQL

DECLARE

noDept_v DepartementnoDeptTYPE

lieu_v DepartementlieuTYPE

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

27

Exemple requecircte SELECT dans PLSQL

DECLARE

sommeSalaires_v EmployesalaireTYPE

noDept_v NUMBER NOT NULL = 10

BEGIN

SELECT SUM(salaire)

INTO sommeSalaires_v

FROM Employe

WHERE noDepartement = noDept_v

END

28

Modifier des donneacutees dans PLSQL

bull Trois commandes du langage de manipulation de donneacutees (LMD) de SQL permettent de modifier une base de donneacutees ndash INSERT

ndash UPDATE

ndash DELETE

29

Modifier des donneacutees dans PLSQL (INSERT)

BEGIN

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (10 lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END

bull Note ndash on peut eacutevidemment utiliser des variables au lieu de simples valeurs

preacutedeacutefinies

30

Modifier des donneacutees dans PLSQL (UPDATE)

DECLAREmajorationSalaire_v EmployesalaireTYPE = 2000

BEGINUPDATE EmployeSET salaire = salaire + majorationSalaire_vWHERE job = lsquoPROGRAMMEURrsquo

END

bull Note ndash contrairement aux affectations PLSQL la clause update utilise le signe

lsquo=lsquo comme opeacuterateur drsquoaffectationndash si une variable a le mecircme nom qursquoun nom drsquoattribut de la table manipuleacutee

dans la clause WHERE le serveur Oracle utilise en prioriteacute lrsquoattribut de table

31

Modifier des donneacutees dans PLSQL (DELETE)

DECLARE

noDept_v EmployenoDeptTYPE = 10

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

END

32

Controcircler les transactions dans PLSQL

bull La premiegravere commande INSERTUPDATEDELETECREATEDROP drsquoun block entamme une nouvelle transaction

bull La fin du block ne termine pas la transactionbull Pour terminer explicitement une transaction utiliser les commandes SQL

ndash COMMIT=gt valide les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

ndash ROLLBACK=gt annule toutes les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

bull Note Une transaction doit ecirctre un ensemble homogegravene de manipulations de la base de donneacutees =gt il faut reacuteflechir agrave tous les endroits ougrave il est leacutegitime de mettre un COMMIT

33

Controcircler les transactions dans PLSQL

DECLARE

noDept_v EmployenoDeptTYPE = 10

majorationSalaire_v EmployesalaireTYPE = 2000

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

COMMIT

UPDATE Employe

SET salaire = salaire + majorationSalaire_v

WHERE job = lsquoPROGRAMMEURrsquo

END

34

Affichage des donneacutees

Option

set serveroutput on cette option permet drsquoactiver lrsquoaffichage des donneacutees dans lrsquooutil sqlplus

Pour afficher un message ou une variable

DBMS_OUTPUTPUT_LINE(lsquomessagersquo)

35

Gestion des exceptionstraitement des erreurs

36

Gestion des exceptions

37

Gestion des exceptions Exemple

38

Gestion des curseurs

bull Neacutecessite lrsquoutilisation de curseurs

Les curseurs sont des zones de travail priveacutees ce sont des zones meacutemoire utiliseacutees pour analyser et interpreacuteter tout ordre SQL

bull Deux types de curseurs

bull les curseurs implicites

Le serveur Oracle utilise des curseurs implicites pour exeacutecuter les requecirctes SQL

bull les curseurs explicites

sont des variables explicitement deacuteclareacutees par le programmeur

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 11: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

11

Blocks imbriqueacutes et porteacutee des variables

DECLARE

variable1_v NUMBER(3) = 10

BEGIN

DECLARE

variable1_v NUMBER(3) = 200

BEGIN

END

END

variable1_v (10)

variable1_v (200)

variable1_v (10)

12

Blocks imbriqueacutes et porteacutee des variables

DECLAREpoids_v NUMBER(3) = 600

message_v VARCHAR2(255) = lsquoProduit 10012rsquo

BEGIN

DECLAREpoids_v NUMBER(3) = 1 -- (poids_v =1)message_v VARCHAR2(255) = lsquoProduit 11001rsquo

pays_v VARCHAR2(50) = lsquoEuropersquo

BEGIN

poids_v = poids_v +1 -- (poids_v = 2)

pays_v = lsquoOuest- rsquo || pays_v

END

poids_v = poids_v +1 -- (poids_v = 601)

message_v = mesage_v || lsquo est en stockrsquo -- (message_v = lsquoProduit 10012 est en stockrsquo)

pays_v = lsquoOuest- rsquo || pays_v -- ILLEGAL

END

13

Exercices

14

Structures de controcircle

bull Branchements conditionnelsndash IF - THEN - END IF

ndash IF - THEN - ELSE - END IF

ndash IF - THEN - ELSIF - END IF

bull Bouclesndash LOOP - END LOOP

ndash FOR - END LOOP

ndash WHILE - END LOOP

ndash Note la commande EXIT permet de sortir de tout type de boucle

ndash Exit when permet de sortir de la boucle selon une condition

15

Structures de controcircle - branchements conditionnels

bull Syntaxe IF ltconditiongt THEN

commandes [ELSIF ltconditiongt THEN

commandes ][ELSE

commandes ]END IF

Note vous pouvez utiliser lrsquoexpression IS NULL dans les conditions

bull Exemples IF nomEmploye_v = lsquoTOTOrsquo THEN

salaire_v = salaire_v 2 END IF

16

Structures de controcircle - branchements conditionnels

IF nomEmploye_v = lsquoTOTOrsquo THENsalaire_v = salaire_v 2

ELSE salaire_v = salaire_v 3

END IF

IF nomEmploye_v = lsquoTOTOrsquo THENsalaire_v = salaire_v 2

ELSIF salaire_v gt 10000 THENsalaire_v = salaire_v 2

ELSE salaire_v = salaire_v 3

END IF

17

Exercices

1- Ecrire un programme plsql qui calcule la somme le produit de deux variables

2- Ecrire un code plSql qui permet de tester le signe drsquoune variable A ( srsquoelle est positive elle reccediloive -1 sinon elle reccediloive +1)

3- Ecrire un code plsql qui donne une appreacuteciation sur une note srsquoelle est lt10 le programme donne a une variable de chaine de caractegraveres la valeur lsquomalrsquo srsquoelle est gt a 10 et lt12 il lui donne la valeur lsquoassez bienrsquo sinon lsquoBienrsquo

18

Structures de controcircle - boucles LOOP

bull Note Sans commande EXIT les boucles LOOP sont infinies

bull Syntaxe LOOP

commandes EXIT [WHEN ltconditiongt]

END LOOP

19

Structures de controcircle - boucles LOOP

bull Exemple

DECLARE

noEmp_v NUMBER (3) = 1

BEGIN

LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1

EXIT WHEN noEmp gt 100

END LOOP

END

20

Structures de controcircle - boucles FOR

bull Syntaxe FOR ltcompteurgt IN ltlimite_infgt ltlimite_supgt

commandes

END LOOP

bull Exemple

DECLARE

noEmp NUMBER (3)

BEGIN

FOR noEmp IN 1 100

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END LOOP

END

21

Structures de controcircle - boucles WHILE

bull Syntaxe WHILE ltconditiongt LOOP

commandes

END LOOP bull Exemple DECLARE

noEmp_v NUMBER (3)BEGIN

noEmp_v = 1WHILE noEmp_v lt= 100 LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1 END LOOP

END

22

Structures de controcircles - remarques sur les boucles

bull Ne pas modifier le compteur drsquoune boucle FORbull Les boucles peuvent ecirctre imbriqueacuteesbull On peut nommer les boucles pour identifier explicitement laquelle de deux

boucles imbriqueacutees se termine ltltboucleExternegtgtLOOP

EXIT WHEN compteur_v = 10 ltltboucleInternegtgt

LOOP EXIT boucleExterne WHEN compteur_v = 100 EXIT boucleInterne WHEN drapeau_v = TRUE

END LOOP boucleInterne END LOOP boucleExterne

23

Interactions avec le serveur Oracle

bull Inclure une requecircte SELECT dans un block PLSQL

bull Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull Modifier des donneacutees dans PLSQL

bull Controcircler les transactions dans PLSQL

bull Deacuteterminer le reacutesultat drsquoune requecircte SELECT dans PLSQL

24

Inclure une requecircte SELECT dans PLSQL

DECLARE

noDept_v NUMBER(2)

lieu_v VARCHAR2(15)

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

ATTENTION la requecircte ne doit retourner que un et un seul tuple Si ce nrsquoest pas le cas les exceptions NO_DATA_FOUND ou TOO_MANY_ROWS sont leveacutees

25

Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull TYPE identifie dynamiquement le type drsquoun attribut drsquoune table

bull ROWTYPEidentifie dynamiquement le type (structureacute) drsquoun tuple drsquoune table

DECLAREdateCommande_v CommandedateCommandeTYPE uneCommande_v CommandeROWTYPE

26

Exemple requecircte SELECT dans PLSQL

DECLARE

noDept_v DepartementnoDeptTYPE

lieu_v DepartementlieuTYPE

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

27

Exemple requecircte SELECT dans PLSQL

DECLARE

sommeSalaires_v EmployesalaireTYPE

noDept_v NUMBER NOT NULL = 10

BEGIN

SELECT SUM(salaire)

INTO sommeSalaires_v

FROM Employe

WHERE noDepartement = noDept_v

END

28

Modifier des donneacutees dans PLSQL

bull Trois commandes du langage de manipulation de donneacutees (LMD) de SQL permettent de modifier une base de donneacutees ndash INSERT

ndash UPDATE

ndash DELETE

29

Modifier des donneacutees dans PLSQL (INSERT)

BEGIN

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (10 lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END

bull Note ndash on peut eacutevidemment utiliser des variables au lieu de simples valeurs

preacutedeacutefinies

30

Modifier des donneacutees dans PLSQL (UPDATE)

DECLAREmajorationSalaire_v EmployesalaireTYPE = 2000

BEGINUPDATE EmployeSET salaire = salaire + majorationSalaire_vWHERE job = lsquoPROGRAMMEURrsquo

END

bull Note ndash contrairement aux affectations PLSQL la clause update utilise le signe

lsquo=lsquo comme opeacuterateur drsquoaffectationndash si une variable a le mecircme nom qursquoun nom drsquoattribut de la table manipuleacutee

dans la clause WHERE le serveur Oracle utilise en prioriteacute lrsquoattribut de table

31

Modifier des donneacutees dans PLSQL (DELETE)

DECLARE

noDept_v EmployenoDeptTYPE = 10

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

END

32

Controcircler les transactions dans PLSQL

bull La premiegravere commande INSERTUPDATEDELETECREATEDROP drsquoun block entamme une nouvelle transaction

bull La fin du block ne termine pas la transactionbull Pour terminer explicitement une transaction utiliser les commandes SQL

ndash COMMIT=gt valide les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

ndash ROLLBACK=gt annule toutes les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

bull Note Une transaction doit ecirctre un ensemble homogegravene de manipulations de la base de donneacutees =gt il faut reacuteflechir agrave tous les endroits ougrave il est leacutegitime de mettre un COMMIT

33

Controcircler les transactions dans PLSQL

DECLARE

noDept_v EmployenoDeptTYPE = 10

majorationSalaire_v EmployesalaireTYPE = 2000

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

COMMIT

UPDATE Employe

SET salaire = salaire + majorationSalaire_v

WHERE job = lsquoPROGRAMMEURrsquo

END

34

Affichage des donneacutees

Option

set serveroutput on cette option permet drsquoactiver lrsquoaffichage des donneacutees dans lrsquooutil sqlplus

Pour afficher un message ou une variable

DBMS_OUTPUTPUT_LINE(lsquomessagersquo)

35

Gestion des exceptionstraitement des erreurs

36

Gestion des exceptions

37

Gestion des exceptions Exemple

38

Gestion des curseurs

bull Neacutecessite lrsquoutilisation de curseurs

Les curseurs sont des zones de travail priveacutees ce sont des zones meacutemoire utiliseacutees pour analyser et interpreacuteter tout ordre SQL

bull Deux types de curseurs

bull les curseurs implicites

Le serveur Oracle utilise des curseurs implicites pour exeacutecuter les requecirctes SQL

bull les curseurs explicites

sont des variables explicitement deacuteclareacutees par le programmeur

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 12: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

12

Blocks imbriqueacutes et porteacutee des variables

DECLAREpoids_v NUMBER(3) = 600

message_v VARCHAR2(255) = lsquoProduit 10012rsquo

BEGIN

DECLAREpoids_v NUMBER(3) = 1 -- (poids_v =1)message_v VARCHAR2(255) = lsquoProduit 11001rsquo

pays_v VARCHAR2(50) = lsquoEuropersquo

BEGIN

poids_v = poids_v +1 -- (poids_v = 2)

pays_v = lsquoOuest- rsquo || pays_v

END

poids_v = poids_v +1 -- (poids_v = 601)

message_v = mesage_v || lsquo est en stockrsquo -- (message_v = lsquoProduit 10012 est en stockrsquo)

pays_v = lsquoOuest- rsquo || pays_v -- ILLEGAL

END

13

Exercices

14

Structures de controcircle

bull Branchements conditionnelsndash IF - THEN - END IF

ndash IF - THEN - ELSE - END IF

ndash IF - THEN - ELSIF - END IF

bull Bouclesndash LOOP - END LOOP

ndash FOR - END LOOP

ndash WHILE - END LOOP

ndash Note la commande EXIT permet de sortir de tout type de boucle

ndash Exit when permet de sortir de la boucle selon une condition

15

Structures de controcircle - branchements conditionnels

bull Syntaxe IF ltconditiongt THEN

commandes [ELSIF ltconditiongt THEN

commandes ][ELSE

commandes ]END IF

Note vous pouvez utiliser lrsquoexpression IS NULL dans les conditions

bull Exemples IF nomEmploye_v = lsquoTOTOrsquo THEN

salaire_v = salaire_v 2 END IF

16

Structures de controcircle - branchements conditionnels

IF nomEmploye_v = lsquoTOTOrsquo THENsalaire_v = salaire_v 2

ELSE salaire_v = salaire_v 3

END IF

IF nomEmploye_v = lsquoTOTOrsquo THENsalaire_v = salaire_v 2

ELSIF salaire_v gt 10000 THENsalaire_v = salaire_v 2

ELSE salaire_v = salaire_v 3

END IF

17

Exercices

1- Ecrire un programme plsql qui calcule la somme le produit de deux variables

2- Ecrire un code plSql qui permet de tester le signe drsquoune variable A ( srsquoelle est positive elle reccediloive -1 sinon elle reccediloive +1)

3- Ecrire un code plsql qui donne une appreacuteciation sur une note srsquoelle est lt10 le programme donne a une variable de chaine de caractegraveres la valeur lsquomalrsquo srsquoelle est gt a 10 et lt12 il lui donne la valeur lsquoassez bienrsquo sinon lsquoBienrsquo

18

Structures de controcircle - boucles LOOP

bull Note Sans commande EXIT les boucles LOOP sont infinies

bull Syntaxe LOOP

commandes EXIT [WHEN ltconditiongt]

END LOOP

19

Structures de controcircle - boucles LOOP

bull Exemple

DECLARE

noEmp_v NUMBER (3) = 1

BEGIN

LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1

EXIT WHEN noEmp gt 100

END LOOP

END

20

Structures de controcircle - boucles FOR

bull Syntaxe FOR ltcompteurgt IN ltlimite_infgt ltlimite_supgt

commandes

END LOOP

bull Exemple

DECLARE

noEmp NUMBER (3)

BEGIN

FOR noEmp IN 1 100

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END LOOP

END

21

Structures de controcircle - boucles WHILE

bull Syntaxe WHILE ltconditiongt LOOP

commandes

END LOOP bull Exemple DECLARE

noEmp_v NUMBER (3)BEGIN

noEmp_v = 1WHILE noEmp_v lt= 100 LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1 END LOOP

END

22

Structures de controcircles - remarques sur les boucles

bull Ne pas modifier le compteur drsquoune boucle FORbull Les boucles peuvent ecirctre imbriqueacuteesbull On peut nommer les boucles pour identifier explicitement laquelle de deux

boucles imbriqueacutees se termine ltltboucleExternegtgtLOOP

EXIT WHEN compteur_v = 10 ltltboucleInternegtgt

LOOP EXIT boucleExterne WHEN compteur_v = 100 EXIT boucleInterne WHEN drapeau_v = TRUE

END LOOP boucleInterne END LOOP boucleExterne

23

Interactions avec le serveur Oracle

bull Inclure une requecircte SELECT dans un block PLSQL

bull Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull Modifier des donneacutees dans PLSQL

bull Controcircler les transactions dans PLSQL

bull Deacuteterminer le reacutesultat drsquoune requecircte SELECT dans PLSQL

24

Inclure une requecircte SELECT dans PLSQL

DECLARE

noDept_v NUMBER(2)

lieu_v VARCHAR2(15)

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

ATTENTION la requecircte ne doit retourner que un et un seul tuple Si ce nrsquoest pas le cas les exceptions NO_DATA_FOUND ou TOO_MANY_ROWS sont leveacutees

25

Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull TYPE identifie dynamiquement le type drsquoun attribut drsquoune table

bull ROWTYPEidentifie dynamiquement le type (structureacute) drsquoun tuple drsquoune table

DECLAREdateCommande_v CommandedateCommandeTYPE uneCommande_v CommandeROWTYPE

26

Exemple requecircte SELECT dans PLSQL

DECLARE

noDept_v DepartementnoDeptTYPE

lieu_v DepartementlieuTYPE

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

27

Exemple requecircte SELECT dans PLSQL

DECLARE

sommeSalaires_v EmployesalaireTYPE

noDept_v NUMBER NOT NULL = 10

BEGIN

SELECT SUM(salaire)

INTO sommeSalaires_v

FROM Employe

WHERE noDepartement = noDept_v

END

28

Modifier des donneacutees dans PLSQL

bull Trois commandes du langage de manipulation de donneacutees (LMD) de SQL permettent de modifier une base de donneacutees ndash INSERT

ndash UPDATE

ndash DELETE

29

Modifier des donneacutees dans PLSQL (INSERT)

BEGIN

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (10 lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END

bull Note ndash on peut eacutevidemment utiliser des variables au lieu de simples valeurs

preacutedeacutefinies

30

Modifier des donneacutees dans PLSQL (UPDATE)

DECLAREmajorationSalaire_v EmployesalaireTYPE = 2000

BEGINUPDATE EmployeSET salaire = salaire + majorationSalaire_vWHERE job = lsquoPROGRAMMEURrsquo

END

bull Note ndash contrairement aux affectations PLSQL la clause update utilise le signe

lsquo=lsquo comme opeacuterateur drsquoaffectationndash si une variable a le mecircme nom qursquoun nom drsquoattribut de la table manipuleacutee

dans la clause WHERE le serveur Oracle utilise en prioriteacute lrsquoattribut de table

31

Modifier des donneacutees dans PLSQL (DELETE)

DECLARE

noDept_v EmployenoDeptTYPE = 10

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

END

32

Controcircler les transactions dans PLSQL

bull La premiegravere commande INSERTUPDATEDELETECREATEDROP drsquoun block entamme une nouvelle transaction

bull La fin du block ne termine pas la transactionbull Pour terminer explicitement une transaction utiliser les commandes SQL

ndash COMMIT=gt valide les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

ndash ROLLBACK=gt annule toutes les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

bull Note Une transaction doit ecirctre un ensemble homogegravene de manipulations de la base de donneacutees =gt il faut reacuteflechir agrave tous les endroits ougrave il est leacutegitime de mettre un COMMIT

33

Controcircler les transactions dans PLSQL

DECLARE

noDept_v EmployenoDeptTYPE = 10

majorationSalaire_v EmployesalaireTYPE = 2000

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

COMMIT

UPDATE Employe

SET salaire = salaire + majorationSalaire_v

WHERE job = lsquoPROGRAMMEURrsquo

END

34

Affichage des donneacutees

Option

set serveroutput on cette option permet drsquoactiver lrsquoaffichage des donneacutees dans lrsquooutil sqlplus

Pour afficher un message ou une variable

DBMS_OUTPUTPUT_LINE(lsquomessagersquo)

35

Gestion des exceptionstraitement des erreurs

36

Gestion des exceptions

37

Gestion des exceptions Exemple

38

Gestion des curseurs

bull Neacutecessite lrsquoutilisation de curseurs

Les curseurs sont des zones de travail priveacutees ce sont des zones meacutemoire utiliseacutees pour analyser et interpreacuteter tout ordre SQL

bull Deux types de curseurs

bull les curseurs implicites

Le serveur Oracle utilise des curseurs implicites pour exeacutecuter les requecirctes SQL

bull les curseurs explicites

sont des variables explicitement deacuteclareacutees par le programmeur

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 13: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

13

Exercices

14

Structures de controcircle

bull Branchements conditionnelsndash IF - THEN - END IF

ndash IF - THEN - ELSE - END IF

ndash IF - THEN - ELSIF - END IF

bull Bouclesndash LOOP - END LOOP

ndash FOR - END LOOP

ndash WHILE - END LOOP

ndash Note la commande EXIT permet de sortir de tout type de boucle

ndash Exit when permet de sortir de la boucle selon une condition

15

Structures de controcircle - branchements conditionnels

bull Syntaxe IF ltconditiongt THEN

commandes [ELSIF ltconditiongt THEN

commandes ][ELSE

commandes ]END IF

Note vous pouvez utiliser lrsquoexpression IS NULL dans les conditions

bull Exemples IF nomEmploye_v = lsquoTOTOrsquo THEN

salaire_v = salaire_v 2 END IF

16

Structures de controcircle - branchements conditionnels

IF nomEmploye_v = lsquoTOTOrsquo THENsalaire_v = salaire_v 2

ELSE salaire_v = salaire_v 3

END IF

IF nomEmploye_v = lsquoTOTOrsquo THENsalaire_v = salaire_v 2

ELSIF salaire_v gt 10000 THENsalaire_v = salaire_v 2

ELSE salaire_v = salaire_v 3

END IF

17

Exercices

1- Ecrire un programme plsql qui calcule la somme le produit de deux variables

2- Ecrire un code plSql qui permet de tester le signe drsquoune variable A ( srsquoelle est positive elle reccediloive -1 sinon elle reccediloive +1)

3- Ecrire un code plsql qui donne une appreacuteciation sur une note srsquoelle est lt10 le programme donne a une variable de chaine de caractegraveres la valeur lsquomalrsquo srsquoelle est gt a 10 et lt12 il lui donne la valeur lsquoassez bienrsquo sinon lsquoBienrsquo

18

Structures de controcircle - boucles LOOP

bull Note Sans commande EXIT les boucles LOOP sont infinies

bull Syntaxe LOOP

commandes EXIT [WHEN ltconditiongt]

END LOOP

19

Structures de controcircle - boucles LOOP

bull Exemple

DECLARE

noEmp_v NUMBER (3) = 1

BEGIN

LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1

EXIT WHEN noEmp gt 100

END LOOP

END

20

Structures de controcircle - boucles FOR

bull Syntaxe FOR ltcompteurgt IN ltlimite_infgt ltlimite_supgt

commandes

END LOOP

bull Exemple

DECLARE

noEmp NUMBER (3)

BEGIN

FOR noEmp IN 1 100

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END LOOP

END

21

Structures de controcircle - boucles WHILE

bull Syntaxe WHILE ltconditiongt LOOP

commandes

END LOOP bull Exemple DECLARE

noEmp_v NUMBER (3)BEGIN

noEmp_v = 1WHILE noEmp_v lt= 100 LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1 END LOOP

END

22

Structures de controcircles - remarques sur les boucles

bull Ne pas modifier le compteur drsquoune boucle FORbull Les boucles peuvent ecirctre imbriqueacuteesbull On peut nommer les boucles pour identifier explicitement laquelle de deux

boucles imbriqueacutees se termine ltltboucleExternegtgtLOOP

EXIT WHEN compteur_v = 10 ltltboucleInternegtgt

LOOP EXIT boucleExterne WHEN compteur_v = 100 EXIT boucleInterne WHEN drapeau_v = TRUE

END LOOP boucleInterne END LOOP boucleExterne

23

Interactions avec le serveur Oracle

bull Inclure une requecircte SELECT dans un block PLSQL

bull Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull Modifier des donneacutees dans PLSQL

bull Controcircler les transactions dans PLSQL

bull Deacuteterminer le reacutesultat drsquoune requecircte SELECT dans PLSQL

24

Inclure une requecircte SELECT dans PLSQL

DECLARE

noDept_v NUMBER(2)

lieu_v VARCHAR2(15)

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

ATTENTION la requecircte ne doit retourner que un et un seul tuple Si ce nrsquoest pas le cas les exceptions NO_DATA_FOUND ou TOO_MANY_ROWS sont leveacutees

25

Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull TYPE identifie dynamiquement le type drsquoun attribut drsquoune table

bull ROWTYPEidentifie dynamiquement le type (structureacute) drsquoun tuple drsquoune table

DECLAREdateCommande_v CommandedateCommandeTYPE uneCommande_v CommandeROWTYPE

26

Exemple requecircte SELECT dans PLSQL

DECLARE

noDept_v DepartementnoDeptTYPE

lieu_v DepartementlieuTYPE

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

27

Exemple requecircte SELECT dans PLSQL

DECLARE

sommeSalaires_v EmployesalaireTYPE

noDept_v NUMBER NOT NULL = 10

BEGIN

SELECT SUM(salaire)

INTO sommeSalaires_v

FROM Employe

WHERE noDepartement = noDept_v

END

28

Modifier des donneacutees dans PLSQL

bull Trois commandes du langage de manipulation de donneacutees (LMD) de SQL permettent de modifier une base de donneacutees ndash INSERT

ndash UPDATE

ndash DELETE

29

Modifier des donneacutees dans PLSQL (INSERT)

BEGIN

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (10 lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END

bull Note ndash on peut eacutevidemment utiliser des variables au lieu de simples valeurs

preacutedeacutefinies

30

Modifier des donneacutees dans PLSQL (UPDATE)

DECLAREmajorationSalaire_v EmployesalaireTYPE = 2000

BEGINUPDATE EmployeSET salaire = salaire + majorationSalaire_vWHERE job = lsquoPROGRAMMEURrsquo

END

bull Note ndash contrairement aux affectations PLSQL la clause update utilise le signe

lsquo=lsquo comme opeacuterateur drsquoaffectationndash si une variable a le mecircme nom qursquoun nom drsquoattribut de la table manipuleacutee

dans la clause WHERE le serveur Oracle utilise en prioriteacute lrsquoattribut de table

31

Modifier des donneacutees dans PLSQL (DELETE)

DECLARE

noDept_v EmployenoDeptTYPE = 10

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

END

32

Controcircler les transactions dans PLSQL

bull La premiegravere commande INSERTUPDATEDELETECREATEDROP drsquoun block entamme une nouvelle transaction

bull La fin du block ne termine pas la transactionbull Pour terminer explicitement une transaction utiliser les commandes SQL

ndash COMMIT=gt valide les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

ndash ROLLBACK=gt annule toutes les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

bull Note Une transaction doit ecirctre un ensemble homogegravene de manipulations de la base de donneacutees =gt il faut reacuteflechir agrave tous les endroits ougrave il est leacutegitime de mettre un COMMIT

33

Controcircler les transactions dans PLSQL

DECLARE

noDept_v EmployenoDeptTYPE = 10

majorationSalaire_v EmployesalaireTYPE = 2000

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

COMMIT

UPDATE Employe

SET salaire = salaire + majorationSalaire_v

WHERE job = lsquoPROGRAMMEURrsquo

END

34

Affichage des donneacutees

Option

set serveroutput on cette option permet drsquoactiver lrsquoaffichage des donneacutees dans lrsquooutil sqlplus

Pour afficher un message ou une variable

DBMS_OUTPUTPUT_LINE(lsquomessagersquo)

35

Gestion des exceptionstraitement des erreurs

36

Gestion des exceptions

37

Gestion des exceptions Exemple

38

Gestion des curseurs

bull Neacutecessite lrsquoutilisation de curseurs

Les curseurs sont des zones de travail priveacutees ce sont des zones meacutemoire utiliseacutees pour analyser et interpreacuteter tout ordre SQL

bull Deux types de curseurs

bull les curseurs implicites

Le serveur Oracle utilise des curseurs implicites pour exeacutecuter les requecirctes SQL

bull les curseurs explicites

sont des variables explicitement deacuteclareacutees par le programmeur

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 14: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

14

Structures de controcircle

bull Branchements conditionnelsndash IF - THEN - END IF

ndash IF - THEN - ELSE - END IF

ndash IF - THEN - ELSIF - END IF

bull Bouclesndash LOOP - END LOOP

ndash FOR - END LOOP

ndash WHILE - END LOOP

ndash Note la commande EXIT permet de sortir de tout type de boucle

ndash Exit when permet de sortir de la boucle selon une condition

15

Structures de controcircle - branchements conditionnels

bull Syntaxe IF ltconditiongt THEN

commandes [ELSIF ltconditiongt THEN

commandes ][ELSE

commandes ]END IF

Note vous pouvez utiliser lrsquoexpression IS NULL dans les conditions

bull Exemples IF nomEmploye_v = lsquoTOTOrsquo THEN

salaire_v = salaire_v 2 END IF

16

Structures de controcircle - branchements conditionnels

IF nomEmploye_v = lsquoTOTOrsquo THENsalaire_v = salaire_v 2

ELSE salaire_v = salaire_v 3

END IF

IF nomEmploye_v = lsquoTOTOrsquo THENsalaire_v = salaire_v 2

ELSIF salaire_v gt 10000 THENsalaire_v = salaire_v 2

ELSE salaire_v = salaire_v 3

END IF

17

Exercices

1- Ecrire un programme plsql qui calcule la somme le produit de deux variables

2- Ecrire un code plSql qui permet de tester le signe drsquoune variable A ( srsquoelle est positive elle reccediloive -1 sinon elle reccediloive +1)

3- Ecrire un code plsql qui donne une appreacuteciation sur une note srsquoelle est lt10 le programme donne a une variable de chaine de caractegraveres la valeur lsquomalrsquo srsquoelle est gt a 10 et lt12 il lui donne la valeur lsquoassez bienrsquo sinon lsquoBienrsquo

18

Structures de controcircle - boucles LOOP

bull Note Sans commande EXIT les boucles LOOP sont infinies

bull Syntaxe LOOP

commandes EXIT [WHEN ltconditiongt]

END LOOP

19

Structures de controcircle - boucles LOOP

bull Exemple

DECLARE

noEmp_v NUMBER (3) = 1

BEGIN

LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1

EXIT WHEN noEmp gt 100

END LOOP

END

20

Structures de controcircle - boucles FOR

bull Syntaxe FOR ltcompteurgt IN ltlimite_infgt ltlimite_supgt

commandes

END LOOP

bull Exemple

DECLARE

noEmp NUMBER (3)

BEGIN

FOR noEmp IN 1 100

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END LOOP

END

21

Structures de controcircle - boucles WHILE

bull Syntaxe WHILE ltconditiongt LOOP

commandes

END LOOP bull Exemple DECLARE

noEmp_v NUMBER (3)BEGIN

noEmp_v = 1WHILE noEmp_v lt= 100 LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1 END LOOP

END

22

Structures de controcircles - remarques sur les boucles

bull Ne pas modifier le compteur drsquoune boucle FORbull Les boucles peuvent ecirctre imbriqueacuteesbull On peut nommer les boucles pour identifier explicitement laquelle de deux

boucles imbriqueacutees se termine ltltboucleExternegtgtLOOP

EXIT WHEN compteur_v = 10 ltltboucleInternegtgt

LOOP EXIT boucleExterne WHEN compteur_v = 100 EXIT boucleInterne WHEN drapeau_v = TRUE

END LOOP boucleInterne END LOOP boucleExterne

23

Interactions avec le serveur Oracle

bull Inclure une requecircte SELECT dans un block PLSQL

bull Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull Modifier des donneacutees dans PLSQL

bull Controcircler les transactions dans PLSQL

bull Deacuteterminer le reacutesultat drsquoune requecircte SELECT dans PLSQL

24

Inclure une requecircte SELECT dans PLSQL

DECLARE

noDept_v NUMBER(2)

lieu_v VARCHAR2(15)

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

ATTENTION la requecircte ne doit retourner que un et un seul tuple Si ce nrsquoest pas le cas les exceptions NO_DATA_FOUND ou TOO_MANY_ROWS sont leveacutees

25

Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull TYPE identifie dynamiquement le type drsquoun attribut drsquoune table

bull ROWTYPEidentifie dynamiquement le type (structureacute) drsquoun tuple drsquoune table

DECLAREdateCommande_v CommandedateCommandeTYPE uneCommande_v CommandeROWTYPE

26

Exemple requecircte SELECT dans PLSQL

DECLARE

noDept_v DepartementnoDeptTYPE

lieu_v DepartementlieuTYPE

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

27

Exemple requecircte SELECT dans PLSQL

DECLARE

sommeSalaires_v EmployesalaireTYPE

noDept_v NUMBER NOT NULL = 10

BEGIN

SELECT SUM(salaire)

INTO sommeSalaires_v

FROM Employe

WHERE noDepartement = noDept_v

END

28

Modifier des donneacutees dans PLSQL

bull Trois commandes du langage de manipulation de donneacutees (LMD) de SQL permettent de modifier une base de donneacutees ndash INSERT

ndash UPDATE

ndash DELETE

29

Modifier des donneacutees dans PLSQL (INSERT)

BEGIN

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (10 lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END

bull Note ndash on peut eacutevidemment utiliser des variables au lieu de simples valeurs

preacutedeacutefinies

30

Modifier des donneacutees dans PLSQL (UPDATE)

DECLAREmajorationSalaire_v EmployesalaireTYPE = 2000

BEGINUPDATE EmployeSET salaire = salaire + majorationSalaire_vWHERE job = lsquoPROGRAMMEURrsquo

END

bull Note ndash contrairement aux affectations PLSQL la clause update utilise le signe

lsquo=lsquo comme opeacuterateur drsquoaffectationndash si une variable a le mecircme nom qursquoun nom drsquoattribut de la table manipuleacutee

dans la clause WHERE le serveur Oracle utilise en prioriteacute lrsquoattribut de table

31

Modifier des donneacutees dans PLSQL (DELETE)

DECLARE

noDept_v EmployenoDeptTYPE = 10

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

END

32

Controcircler les transactions dans PLSQL

bull La premiegravere commande INSERTUPDATEDELETECREATEDROP drsquoun block entamme une nouvelle transaction

bull La fin du block ne termine pas la transactionbull Pour terminer explicitement une transaction utiliser les commandes SQL

ndash COMMIT=gt valide les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

ndash ROLLBACK=gt annule toutes les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

bull Note Une transaction doit ecirctre un ensemble homogegravene de manipulations de la base de donneacutees =gt il faut reacuteflechir agrave tous les endroits ougrave il est leacutegitime de mettre un COMMIT

33

Controcircler les transactions dans PLSQL

DECLARE

noDept_v EmployenoDeptTYPE = 10

majorationSalaire_v EmployesalaireTYPE = 2000

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

COMMIT

UPDATE Employe

SET salaire = salaire + majorationSalaire_v

WHERE job = lsquoPROGRAMMEURrsquo

END

34

Affichage des donneacutees

Option

set serveroutput on cette option permet drsquoactiver lrsquoaffichage des donneacutees dans lrsquooutil sqlplus

Pour afficher un message ou une variable

DBMS_OUTPUTPUT_LINE(lsquomessagersquo)

35

Gestion des exceptionstraitement des erreurs

36

Gestion des exceptions

37

Gestion des exceptions Exemple

38

Gestion des curseurs

bull Neacutecessite lrsquoutilisation de curseurs

Les curseurs sont des zones de travail priveacutees ce sont des zones meacutemoire utiliseacutees pour analyser et interpreacuteter tout ordre SQL

bull Deux types de curseurs

bull les curseurs implicites

Le serveur Oracle utilise des curseurs implicites pour exeacutecuter les requecirctes SQL

bull les curseurs explicites

sont des variables explicitement deacuteclareacutees par le programmeur

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 15: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

15

Structures de controcircle - branchements conditionnels

bull Syntaxe IF ltconditiongt THEN

commandes [ELSIF ltconditiongt THEN

commandes ][ELSE

commandes ]END IF

Note vous pouvez utiliser lrsquoexpression IS NULL dans les conditions

bull Exemples IF nomEmploye_v = lsquoTOTOrsquo THEN

salaire_v = salaire_v 2 END IF

16

Structures de controcircle - branchements conditionnels

IF nomEmploye_v = lsquoTOTOrsquo THENsalaire_v = salaire_v 2

ELSE salaire_v = salaire_v 3

END IF

IF nomEmploye_v = lsquoTOTOrsquo THENsalaire_v = salaire_v 2

ELSIF salaire_v gt 10000 THENsalaire_v = salaire_v 2

ELSE salaire_v = salaire_v 3

END IF

17

Exercices

1- Ecrire un programme plsql qui calcule la somme le produit de deux variables

2- Ecrire un code plSql qui permet de tester le signe drsquoune variable A ( srsquoelle est positive elle reccediloive -1 sinon elle reccediloive +1)

3- Ecrire un code plsql qui donne une appreacuteciation sur une note srsquoelle est lt10 le programme donne a une variable de chaine de caractegraveres la valeur lsquomalrsquo srsquoelle est gt a 10 et lt12 il lui donne la valeur lsquoassez bienrsquo sinon lsquoBienrsquo

18

Structures de controcircle - boucles LOOP

bull Note Sans commande EXIT les boucles LOOP sont infinies

bull Syntaxe LOOP

commandes EXIT [WHEN ltconditiongt]

END LOOP

19

Structures de controcircle - boucles LOOP

bull Exemple

DECLARE

noEmp_v NUMBER (3) = 1

BEGIN

LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1

EXIT WHEN noEmp gt 100

END LOOP

END

20

Structures de controcircle - boucles FOR

bull Syntaxe FOR ltcompteurgt IN ltlimite_infgt ltlimite_supgt

commandes

END LOOP

bull Exemple

DECLARE

noEmp NUMBER (3)

BEGIN

FOR noEmp IN 1 100

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END LOOP

END

21

Structures de controcircle - boucles WHILE

bull Syntaxe WHILE ltconditiongt LOOP

commandes

END LOOP bull Exemple DECLARE

noEmp_v NUMBER (3)BEGIN

noEmp_v = 1WHILE noEmp_v lt= 100 LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1 END LOOP

END

22

Structures de controcircles - remarques sur les boucles

bull Ne pas modifier le compteur drsquoune boucle FORbull Les boucles peuvent ecirctre imbriqueacuteesbull On peut nommer les boucles pour identifier explicitement laquelle de deux

boucles imbriqueacutees se termine ltltboucleExternegtgtLOOP

EXIT WHEN compteur_v = 10 ltltboucleInternegtgt

LOOP EXIT boucleExterne WHEN compteur_v = 100 EXIT boucleInterne WHEN drapeau_v = TRUE

END LOOP boucleInterne END LOOP boucleExterne

23

Interactions avec le serveur Oracle

bull Inclure une requecircte SELECT dans un block PLSQL

bull Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull Modifier des donneacutees dans PLSQL

bull Controcircler les transactions dans PLSQL

bull Deacuteterminer le reacutesultat drsquoune requecircte SELECT dans PLSQL

24

Inclure une requecircte SELECT dans PLSQL

DECLARE

noDept_v NUMBER(2)

lieu_v VARCHAR2(15)

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

ATTENTION la requecircte ne doit retourner que un et un seul tuple Si ce nrsquoest pas le cas les exceptions NO_DATA_FOUND ou TOO_MANY_ROWS sont leveacutees

25

Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull TYPE identifie dynamiquement le type drsquoun attribut drsquoune table

bull ROWTYPEidentifie dynamiquement le type (structureacute) drsquoun tuple drsquoune table

DECLAREdateCommande_v CommandedateCommandeTYPE uneCommande_v CommandeROWTYPE

26

Exemple requecircte SELECT dans PLSQL

DECLARE

noDept_v DepartementnoDeptTYPE

lieu_v DepartementlieuTYPE

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

27

Exemple requecircte SELECT dans PLSQL

DECLARE

sommeSalaires_v EmployesalaireTYPE

noDept_v NUMBER NOT NULL = 10

BEGIN

SELECT SUM(salaire)

INTO sommeSalaires_v

FROM Employe

WHERE noDepartement = noDept_v

END

28

Modifier des donneacutees dans PLSQL

bull Trois commandes du langage de manipulation de donneacutees (LMD) de SQL permettent de modifier une base de donneacutees ndash INSERT

ndash UPDATE

ndash DELETE

29

Modifier des donneacutees dans PLSQL (INSERT)

BEGIN

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (10 lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END

bull Note ndash on peut eacutevidemment utiliser des variables au lieu de simples valeurs

preacutedeacutefinies

30

Modifier des donneacutees dans PLSQL (UPDATE)

DECLAREmajorationSalaire_v EmployesalaireTYPE = 2000

BEGINUPDATE EmployeSET salaire = salaire + majorationSalaire_vWHERE job = lsquoPROGRAMMEURrsquo

END

bull Note ndash contrairement aux affectations PLSQL la clause update utilise le signe

lsquo=lsquo comme opeacuterateur drsquoaffectationndash si une variable a le mecircme nom qursquoun nom drsquoattribut de la table manipuleacutee

dans la clause WHERE le serveur Oracle utilise en prioriteacute lrsquoattribut de table

31

Modifier des donneacutees dans PLSQL (DELETE)

DECLARE

noDept_v EmployenoDeptTYPE = 10

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

END

32

Controcircler les transactions dans PLSQL

bull La premiegravere commande INSERTUPDATEDELETECREATEDROP drsquoun block entamme une nouvelle transaction

bull La fin du block ne termine pas la transactionbull Pour terminer explicitement une transaction utiliser les commandes SQL

ndash COMMIT=gt valide les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

ndash ROLLBACK=gt annule toutes les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

bull Note Une transaction doit ecirctre un ensemble homogegravene de manipulations de la base de donneacutees =gt il faut reacuteflechir agrave tous les endroits ougrave il est leacutegitime de mettre un COMMIT

33

Controcircler les transactions dans PLSQL

DECLARE

noDept_v EmployenoDeptTYPE = 10

majorationSalaire_v EmployesalaireTYPE = 2000

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

COMMIT

UPDATE Employe

SET salaire = salaire + majorationSalaire_v

WHERE job = lsquoPROGRAMMEURrsquo

END

34

Affichage des donneacutees

Option

set serveroutput on cette option permet drsquoactiver lrsquoaffichage des donneacutees dans lrsquooutil sqlplus

Pour afficher un message ou une variable

DBMS_OUTPUTPUT_LINE(lsquomessagersquo)

35

Gestion des exceptionstraitement des erreurs

36

Gestion des exceptions

37

Gestion des exceptions Exemple

38

Gestion des curseurs

bull Neacutecessite lrsquoutilisation de curseurs

Les curseurs sont des zones de travail priveacutees ce sont des zones meacutemoire utiliseacutees pour analyser et interpreacuteter tout ordre SQL

bull Deux types de curseurs

bull les curseurs implicites

Le serveur Oracle utilise des curseurs implicites pour exeacutecuter les requecirctes SQL

bull les curseurs explicites

sont des variables explicitement deacuteclareacutees par le programmeur

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 16: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

16

Structures de controcircle - branchements conditionnels

IF nomEmploye_v = lsquoTOTOrsquo THENsalaire_v = salaire_v 2

ELSE salaire_v = salaire_v 3

END IF

IF nomEmploye_v = lsquoTOTOrsquo THENsalaire_v = salaire_v 2

ELSIF salaire_v gt 10000 THENsalaire_v = salaire_v 2

ELSE salaire_v = salaire_v 3

END IF

17

Exercices

1- Ecrire un programme plsql qui calcule la somme le produit de deux variables

2- Ecrire un code plSql qui permet de tester le signe drsquoune variable A ( srsquoelle est positive elle reccediloive -1 sinon elle reccediloive +1)

3- Ecrire un code plsql qui donne une appreacuteciation sur une note srsquoelle est lt10 le programme donne a une variable de chaine de caractegraveres la valeur lsquomalrsquo srsquoelle est gt a 10 et lt12 il lui donne la valeur lsquoassez bienrsquo sinon lsquoBienrsquo

18

Structures de controcircle - boucles LOOP

bull Note Sans commande EXIT les boucles LOOP sont infinies

bull Syntaxe LOOP

commandes EXIT [WHEN ltconditiongt]

END LOOP

19

Structures de controcircle - boucles LOOP

bull Exemple

DECLARE

noEmp_v NUMBER (3) = 1

BEGIN

LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1

EXIT WHEN noEmp gt 100

END LOOP

END

20

Structures de controcircle - boucles FOR

bull Syntaxe FOR ltcompteurgt IN ltlimite_infgt ltlimite_supgt

commandes

END LOOP

bull Exemple

DECLARE

noEmp NUMBER (3)

BEGIN

FOR noEmp IN 1 100

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END LOOP

END

21

Structures de controcircle - boucles WHILE

bull Syntaxe WHILE ltconditiongt LOOP

commandes

END LOOP bull Exemple DECLARE

noEmp_v NUMBER (3)BEGIN

noEmp_v = 1WHILE noEmp_v lt= 100 LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1 END LOOP

END

22

Structures de controcircles - remarques sur les boucles

bull Ne pas modifier le compteur drsquoune boucle FORbull Les boucles peuvent ecirctre imbriqueacuteesbull On peut nommer les boucles pour identifier explicitement laquelle de deux

boucles imbriqueacutees se termine ltltboucleExternegtgtLOOP

EXIT WHEN compteur_v = 10 ltltboucleInternegtgt

LOOP EXIT boucleExterne WHEN compteur_v = 100 EXIT boucleInterne WHEN drapeau_v = TRUE

END LOOP boucleInterne END LOOP boucleExterne

23

Interactions avec le serveur Oracle

bull Inclure une requecircte SELECT dans un block PLSQL

bull Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull Modifier des donneacutees dans PLSQL

bull Controcircler les transactions dans PLSQL

bull Deacuteterminer le reacutesultat drsquoune requecircte SELECT dans PLSQL

24

Inclure une requecircte SELECT dans PLSQL

DECLARE

noDept_v NUMBER(2)

lieu_v VARCHAR2(15)

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

ATTENTION la requecircte ne doit retourner que un et un seul tuple Si ce nrsquoest pas le cas les exceptions NO_DATA_FOUND ou TOO_MANY_ROWS sont leveacutees

25

Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull TYPE identifie dynamiquement le type drsquoun attribut drsquoune table

bull ROWTYPEidentifie dynamiquement le type (structureacute) drsquoun tuple drsquoune table

DECLAREdateCommande_v CommandedateCommandeTYPE uneCommande_v CommandeROWTYPE

26

Exemple requecircte SELECT dans PLSQL

DECLARE

noDept_v DepartementnoDeptTYPE

lieu_v DepartementlieuTYPE

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

27

Exemple requecircte SELECT dans PLSQL

DECLARE

sommeSalaires_v EmployesalaireTYPE

noDept_v NUMBER NOT NULL = 10

BEGIN

SELECT SUM(salaire)

INTO sommeSalaires_v

FROM Employe

WHERE noDepartement = noDept_v

END

28

Modifier des donneacutees dans PLSQL

bull Trois commandes du langage de manipulation de donneacutees (LMD) de SQL permettent de modifier une base de donneacutees ndash INSERT

ndash UPDATE

ndash DELETE

29

Modifier des donneacutees dans PLSQL (INSERT)

BEGIN

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (10 lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END

bull Note ndash on peut eacutevidemment utiliser des variables au lieu de simples valeurs

preacutedeacutefinies

30

Modifier des donneacutees dans PLSQL (UPDATE)

DECLAREmajorationSalaire_v EmployesalaireTYPE = 2000

BEGINUPDATE EmployeSET salaire = salaire + majorationSalaire_vWHERE job = lsquoPROGRAMMEURrsquo

END

bull Note ndash contrairement aux affectations PLSQL la clause update utilise le signe

lsquo=lsquo comme opeacuterateur drsquoaffectationndash si une variable a le mecircme nom qursquoun nom drsquoattribut de la table manipuleacutee

dans la clause WHERE le serveur Oracle utilise en prioriteacute lrsquoattribut de table

31

Modifier des donneacutees dans PLSQL (DELETE)

DECLARE

noDept_v EmployenoDeptTYPE = 10

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

END

32

Controcircler les transactions dans PLSQL

bull La premiegravere commande INSERTUPDATEDELETECREATEDROP drsquoun block entamme une nouvelle transaction

bull La fin du block ne termine pas la transactionbull Pour terminer explicitement une transaction utiliser les commandes SQL

ndash COMMIT=gt valide les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

ndash ROLLBACK=gt annule toutes les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

bull Note Une transaction doit ecirctre un ensemble homogegravene de manipulations de la base de donneacutees =gt il faut reacuteflechir agrave tous les endroits ougrave il est leacutegitime de mettre un COMMIT

33

Controcircler les transactions dans PLSQL

DECLARE

noDept_v EmployenoDeptTYPE = 10

majorationSalaire_v EmployesalaireTYPE = 2000

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

COMMIT

UPDATE Employe

SET salaire = salaire + majorationSalaire_v

WHERE job = lsquoPROGRAMMEURrsquo

END

34

Affichage des donneacutees

Option

set serveroutput on cette option permet drsquoactiver lrsquoaffichage des donneacutees dans lrsquooutil sqlplus

Pour afficher un message ou une variable

DBMS_OUTPUTPUT_LINE(lsquomessagersquo)

35

Gestion des exceptionstraitement des erreurs

36

Gestion des exceptions

37

Gestion des exceptions Exemple

38

Gestion des curseurs

bull Neacutecessite lrsquoutilisation de curseurs

Les curseurs sont des zones de travail priveacutees ce sont des zones meacutemoire utiliseacutees pour analyser et interpreacuteter tout ordre SQL

bull Deux types de curseurs

bull les curseurs implicites

Le serveur Oracle utilise des curseurs implicites pour exeacutecuter les requecirctes SQL

bull les curseurs explicites

sont des variables explicitement deacuteclareacutees par le programmeur

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 17: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

17

Exercices

1- Ecrire un programme plsql qui calcule la somme le produit de deux variables

2- Ecrire un code plSql qui permet de tester le signe drsquoune variable A ( srsquoelle est positive elle reccediloive -1 sinon elle reccediloive +1)

3- Ecrire un code plsql qui donne une appreacuteciation sur une note srsquoelle est lt10 le programme donne a une variable de chaine de caractegraveres la valeur lsquomalrsquo srsquoelle est gt a 10 et lt12 il lui donne la valeur lsquoassez bienrsquo sinon lsquoBienrsquo

18

Structures de controcircle - boucles LOOP

bull Note Sans commande EXIT les boucles LOOP sont infinies

bull Syntaxe LOOP

commandes EXIT [WHEN ltconditiongt]

END LOOP

19

Structures de controcircle - boucles LOOP

bull Exemple

DECLARE

noEmp_v NUMBER (3) = 1

BEGIN

LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1

EXIT WHEN noEmp gt 100

END LOOP

END

20

Structures de controcircle - boucles FOR

bull Syntaxe FOR ltcompteurgt IN ltlimite_infgt ltlimite_supgt

commandes

END LOOP

bull Exemple

DECLARE

noEmp NUMBER (3)

BEGIN

FOR noEmp IN 1 100

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END LOOP

END

21

Structures de controcircle - boucles WHILE

bull Syntaxe WHILE ltconditiongt LOOP

commandes

END LOOP bull Exemple DECLARE

noEmp_v NUMBER (3)BEGIN

noEmp_v = 1WHILE noEmp_v lt= 100 LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1 END LOOP

END

22

Structures de controcircles - remarques sur les boucles

bull Ne pas modifier le compteur drsquoune boucle FORbull Les boucles peuvent ecirctre imbriqueacuteesbull On peut nommer les boucles pour identifier explicitement laquelle de deux

boucles imbriqueacutees se termine ltltboucleExternegtgtLOOP

EXIT WHEN compteur_v = 10 ltltboucleInternegtgt

LOOP EXIT boucleExterne WHEN compteur_v = 100 EXIT boucleInterne WHEN drapeau_v = TRUE

END LOOP boucleInterne END LOOP boucleExterne

23

Interactions avec le serveur Oracle

bull Inclure une requecircte SELECT dans un block PLSQL

bull Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull Modifier des donneacutees dans PLSQL

bull Controcircler les transactions dans PLSQL

bull Deacuteterminer le reacutesultat drsquoune requecircte SELECT dans PLSQL

24

Inclure une requecircte SELECT dans PLSQL

DECLARE

noDept_v NUMBER(2)

lieu_v VARCHAR2(15)

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

ATTENTION la requecircte ne doit retourner que un et un seul tuple Si ce nrsquoest pas le cas les exceptions NO_DATA_FOUND ou TOO_MANY_ROWS sont leveacutees

25

Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull TYPE identifie dynamiquement le type drsquoun attribut drsquoune table

bull ROWTYPEidentifie dynamiquement le type (structureacute) drsquoun tuple drsquoune table

DECLAREdateCommande_v CommandedateCommandeTYPE uneCommande_v CommandeROWTYPE

26

Exemple requecircte SELECT dans PLSQL

DECLARE

noDept_v DepartementnoDeptTYPE

lieu_v DepartementlieuTYPE

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

27

Exemple requecircte SELECT dans PLSQL

DECLARE

sommeSalaires_v EmployesalaireTYPE

noDept_v NUMBER NOT NULL = 10

BEGIN

SELECT SUM(salaire)

INTO sommeSalaires_v

FROM Employe

WHERE noDepartement = noDept_v

END

28

Modifier des donneacutees dans PLSQL

bull Trois commandes du langage de manipulation de donneacutees (LMD) de SQL permettent de modifier une base de donneacutees ndash INSERT

ndash UPDATE

ndash DELETE

29

Modifier des donneacutees dans PLSQL (INSERT)

BEGIN

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (10 lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END

bull Note ndash on peut eacutevidemment utiliser des variables au lieu de simples valeurs

preacutedeacutefinies

30

Modifier des donneacutees dans PLSQL (UPDATE)

DECLAREmajorationSalaire_v EmployesalaireTYPE = 2000

BEGINUPDATE EmployeSET salaire = salaire + majorationSalaire_vWHERE job = lsquoPROGRAMMEURrsquo

END

bull Note ndash contrairement aux affectations PLSQL la clause update utilise le signe

lsquo=lsquo comme opeacuterateur drsquoaffectationndash si une variable a le mecircme nom qursquoun nom drsquoattribut de la table manipuleacutee

dans la clause WHERE le serveur Oracle utilise en prioriteacute lrsquoattribut de table

31

Modifier des donneacutees dans PLSQL (DELETE)

DECLARE

noDept_v EmployenoDeptTYPE = 10

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

END

32

Controcircler les transactions dans PLSQL

bull La premiegravere commande INSERTUPDATEDELETECREATEDROP drsquoun block entamme une nouvelle transaction

bull La fin du block ne termine pas la transactionbull Pour terminer explicitement une transaction utiliser les commandes SQL

ndash COMMIT=gt valide les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

ndash ROLLBACK=gt annule toutes les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

bull Note Une transaction doit ecirctre un ensemble homogegravene de manipulations de la base de donneacutees =gt il faut reacuteflechir agrave tous les endroits ougrave il est leacutegitime de mettre un COMMIT

33

Controcircler les transactions dans PLSQL

DECLARE

noDept_v EmployenoDeptTYPE = 10

majorationSalaire_v EmployesalaireTYPE = 2000

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

COMMIT

UPDATE Employe

SET salaire = salaire + majorationSalaire_v

WHERE job = lsquoPROGRAMMEURrsquo

END

34

Affichage des donneacutees

Option

set serveroutput on cette option permet drsquoactiver lrsquoaffichage des donneacutees dans lrsquooutil sqlplus

Pour afficher un message ou une variable

DBMS_OUTPUTPUT_LINE(lsquomessagersquo)

35

Gestion des exceptionstraitement des erreurs

36

Gestion des exceptions

37

Gestion des exceptions Exemple

38

Gestion des curseurs

bull Neacutecessite lrsquoutilisation de curseurs

Les curseurs sont des zones de travail priveacutees ce sont des zones meacutemoire utiliseacutees pour analyser et interpreacuteter tout ordre SQL

bull Deux types de curseurs

bull les curseurs implicites

Le serveur Oracle utilise des curseurs implicites pour exeacutecuter les requecirctes SQL

bull les curseurs explicites

sont des variables explicitement deacuteclareacutees par le programmeur

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 18: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

18

Structures de controcircle - boucles LOOP

bull Note Sans commande EXIT les boucles LOOP sont infinies

bull Syntaxe LOOP

commandes EXIT [WHEN ltconditiongt]

END LOOP

19

Structures de controcircle - boucles LOOP

bull Exemple

DECLARE

noEmp_v NUMBER (3) = 1

BEGIN

LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1

EXIT WHEN noEmp gt 100

END LOOP

END

20

Structures de controcircle - boucles FOR

bull Syntaxe FOR ltcompteurgt IN ltlimite_infgt ltlimite_supgt

commandes

END LOOP

bull Exemple

DECLARE

noEmp NUMBER (3)

BEGIN

FOR noEmp IN 1 100

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END LOOP

END

21

Structures de controcircle - boucles WHILE

bull Syntaxe WHILE ltconditiongt LOOP

commandes

END LOOP bull Exemple DECLARE

noEmp_v NUMBER (3)BEGIN

noEmp_v = 1WHILE noEmp_v lt= 100 LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1 END LOOP

END

22

Structures de controcircles - remarques sur les boucles

bull Ne pas modifier le compteur drsquoune boucle FORbull Les boucles peuvent ecirctre imbriqueacuteesbull On peut nommer les boucles pour identifier explicitement laquelle de deux

boucles imbriqueacutees se termine ltltboucleExternegtgtLOOP

EXIT WHEN compteur_v = 10 ltltboucleInternegtgt

LOOP EXIT boucleExterne WHEN compteur_v = 100 EXIT boucleInterne WHEN drapeau_v = TRUE

END LOOP boucleInterne END LOOP boucleExterne

23

Interactions avec le serveur Oracle

bull Inclure une requecircte SELECT dans un block PLSQL

bull Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull Modifier des donneacutees dans PLSQL

bull Controcircler les transactions dans PLSQL

bull Deacuteterminer le reacutesultat drsquoune requecircte SELECT dans PLSQL

24

Inclure une requecircte SELECT dans PLSQL

DECLARE

noDept_v NUMBER(2)

lieu_v VARCHAR2(15)

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

ATTENTION la requecircte ne doit retourner que un et un seul tuple Si ce nrsquoest pas le cas les exceptions NO_DATA_FOUND ou TOO_MANY_ROWS sont leveacutees

25

Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull TYPE identifie dynamiquement le type drsquoun attribut drsquoune table

bull ROWTYPEidentifie dynamiquement le type (structureacute) drsquoun tuple drsquoune table

DECLAREdateCommande_v CommandedateCommandeTYPE uneCommande_v CommandeROWTYPE

26

Exemple requecircte SELECT dans PLSQL

DECLARE

noDept_v DepartementnoDeptTYPE

lieu_v DepartementlieuTYPE

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

27

Exemple requecircte SELECT dans PLSQL

DECLARE

sommeSalaires_v EmployesalaireTYPE

noDept_v NUMBER NOT NULL = 10

BEGIN

SELECT SUM(salaire)

INTO sommeSalaires_v

FROM Employe

WHERE noDepartement = noDept_v

END

28

Modifier des donneacutees dans PLSQL

bull Trois commandes du langage de manipulation de donneacutees (LMD) de SQL permettent de modifier une base de donneacutees ndash INSERT

ndash UPDATE

ndash DELETE

29

Modifier des donneacutees dans PLSQL (INSERT)

BEGIN

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (10 lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END

bull Note ndash on peut eacutevidemment utiliser des variables au lieu de simples valeurs

preacutedeacutefinies

30

Modifier des donneacutees dans PLSQL (UPDATE)

DECLAREmajorationSalaire_v EmployesalaireTYPE = 2000

BEGINUPDATE EmployeSET salaire = salaire + majorationSalaire_vWHERE job = lsquoPROGRAMMEURrsquo

END

bull Note ndash contrairement aux affectations PLSQL la clause update utilise le signe

lsquo=lsquo comme opeacuterateur drsquoaffectationndash si une variable a le mecircme nom qursquoun nom drsquoattribut de la table manipuleacutee

dans la clause WHERE le serveur Oracle utilise en prioriteacute lrsquoattribut de table

31

Modifier des donneacutees dans PLSQL (DELETE)

DECLARE

noDept_v EmployenoDeptTYPE = 10

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

END

32

Controcircler les transactions dans PLSQL

bull La premiegravere commande INSERTUPDATEDELETECREATEDROP drsquoun block entamme une nouvelle transaction

bull La fin du block ne termine pas la transactionbull Pour terminer explicitement une transaction utiliser les commandes SQL

ndash COMMIT=gt valide les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

ndash ROLLBACK=gt annule toutes les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

bull Note Une transaction doit ecirctre un ensemble homogegravene de manipulations de la base de donneacutees =gt il faut reacuteflechir agrave tous les endroits ougrave il est leacutegitime de mettre un COMMIT

33

Controcircler les transactions dans PLSQL

DECLARE

noDept_v EmployenoDeptTYPE = 10

majorationSalaire_v EmployesalaireTYPE = 2000

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

COMMIT

UPDATE Employe

SET salaire = salaire + majorationSalaire_v

WHERE job = lsquoPROGRAMMEURrsquo

END

34

Affichage des donneacutees

Option

set serveroutput on cette option permet drsquoactiver lrsquoaffichage des donneacutees dans lrsquooutil sqlplus

Pour afficher un message ou une variable

DBMS_OUTPUTPUT_LINE(lsquomessagersquo)

35

Gestion des exceptionstraitement des erreurs

36

Gestion des exceptions

37

Gestion des exceptions Exemple

38

Gestion des curseurs

bull Neacutecessite lrsquoutilisation de curseurs

Les curseurs sont des zones de travail priveacutees ce sont des zones meacutemoire utiliseacutees pour analyser et interpreacuteter tout ordre SQL

bull Deux types de curseurs

bull les curseurs implicites

Le serveur Oracle utilise des curseurs implicites pour exeacutecuter les requecirctes SQL

bull les curseurs explicites

sont des variables explicitement deacuteclareacutees par le programmeur

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 19: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

19

Structures de controcircle - boucles LOOP

bull Exemple

DECLARE

noEmp_v NUMBER (3) = 1

BEGIN

LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1

EXIT WHEN noEmp gt 100

END LOOP

END

20

Structures de controcircle - boucles FOR

bull Syntaxe FOR ltcompteurgt IN ltlimite_infgt ltlimite_supgt

commandes

END LOOP

bull Exemple

DECLARE

noEmp NUMBER (3)

BEGIN

FOR noEmp IN 1 100

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END LOOP

END

21

Structures de controcircle - boucles WHILE

bull Syntaxe WHILE ltconditiongt LOOP

commandes

END LOOP bull Exemple DECLARE

noEmp_v NUMBER (3)BEGIN

noEmp_v = 1WHILE noEmp_v lt= 100 LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1 END LOOP

END

22

Structures de controcircles - remarques sur les boucles

bull Ne pas modifier le compteur drsquoune boucle FORbull Les boucles peuvent ecirctre imbriqueacuteesbull On peut nommer les boucles pour identifier explicitement laquelle de deux

boucles imbriqueacutees se termine ltltboucleExternegtgtLOOP

EXIT WHEN compteur_v = 10 ltltboucleInternegtgt

LOOP EXIT boucleExterne WHEN compteur_v = 100 EXIT boucleInterne WHEN drapeau_v = TRUE

END LOOP boucleInterne END LOOP boucleExterne

23

Interactions avec le serveur Oracle

bull Inclure une requecircte SELECT dans un block PLSQL

bull Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull Modifier des donneacutees dans PLSQL

bull Controcircler les transactions dans PLSQL

bull Deacuteterminer le reacutesultat drsquoune requecircte SELECT dans PLSQL

24

Inclure une requecircte SELECT dans PLSQL

DECLARE

noDept_v NUMBER(2)

lieu_v VARCHAR2(15)

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

ATTENTION la requecircte ne doit retourner que un et un seul tuple Si ce nrsquoest pas le cas les exceptions NO_DATA_FOUND ou TOO_MANY_ROWS sont leveacutees

25

Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull TYPE identifie dynamiquement le type drsquoun attribut drsquoune table

bull ROWTYPEidentifie dynamiquement le type (structureacute) drsquoun tuple drsquoune table

DECLAREdateCommande_v CommandedateCommandeTYPE uneCommande_v CommandeROWTYPE

26

Exemple requecircte SELECT dans PLSQL

DECLARE

noDept_v DepartementnoDeptTYPE

lieu_v DepartementlieuTYPE

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

27

Exemple requecircte SELECT dans PLSQL

DECLARE

sommeSalaires_v EmployesalaireTYPE

noDept_v NUMBER NOT NULL = 10

BEGIN

SELECT SUM(salaire)

INTO sommeSalaires_v

FROM Employe

WHERE noDepartement = noDept_v

END

28

Modifier des donneacutees dans PLSQL

bull Trois commandes du langage de manipulation de donneacutees (LMD) de SQL permettent de modifier une base de donneacutees ndash INSERT

ndash UPDATE

ndash DELETE

29

Modifier des donneacutees dans PLSQL (INSERT)

BEGIN

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (10 lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END

bull Note ndash on peut eacutevidemment utiliser des variables au lieu de simples valeurs

preacutedeacutefinies

30

Modifier des donneacutees dans PLSQL (UPDATE)

DECLAREmajorationSalaire_v EmployesalaireTYPE = 2000

BEGINUPDATE EmployeSET salaire = salaire + majorationSalaire_vWHERE job = lsquoPROGRAMMEURrsquo

END

bull Note ndash contrairement aux affectations PLSQL la clause update utilise le signe

lsquo=lsquo comme opeacuterateur drsquoaffectationndash si une variable a le mecircme nom qursquoun nom drsquoattribut de la table manipuleacutee

dans la clause WHERE le serveur Oracle utilise en prioriteacute lrsquoattribut de table

31

Modifier des donneacutees dans PLSQL (DELETE)

DECLARE

noDept_v EmployenoDeptTYPE = 10

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

END

32

Controcircler les transactions dans PLSQL

bull La premiegravere commande INSERTUPDATEDELETECREATEDROP drsquoun block entamme une nouvelle transaction

bull La fin du block ne termine pas la transactionbull Pour terminer explicitement une transaction utiliser les commandes SQL

ndash COMMIT=gt valide les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

ndash ROLLBACK=gt annule toutes les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

bull Note Une transaction doit ecirctre un ensemble homogegravene de manipulations de la base de donneacutees =gt il faut reacuteflechir agrave tous les endroits ougrave il est leacutegitime de mettre un COMMIT

33

Controcircler les transactions dans PLSQL

DECLARE

noDept_v EmployenoDeptTYPE = 10

majorationSalaire_v EmployesalaireTYPE = 2000

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

COMMIT

UPDATE Employe

SET salaire = salaire + majorationSalaire_v

WHERE job = lsquoPROGRAMMEURrsquo

END

34

Affichage des donneacutees

Option

set serveroutput on cette option permet drsquoactiver lrsquoaffichage des donneacutees dans lrsquooutil sqlplus

Pour afficher un message ou une variable

DBMS_OUTPUTPUT_LINE(lsquomessagersquo)

35

Gestion des exceptionstraitement des erreurs

36

Gestion des exceptions

37

Gestion des exceptions Exemple

38

Gestion des curseurs

bull Neacutecessite lrsquoutilisation de curseurs

Les curseurs sont des zones de travail priveacutees ce sont des zones meacutemoire utiliseacutees pour analyser et interpreacuteter tout ordre SQL

bull Deux types de curseurs

bull les curseurs implicites

Le serveur Oracle utilise des curseurs implicites pour exeacutecuter les requecirctes SQL

bull les curseurs explicites

sont des variables explicitement deacuteclareacutees par le programmeur

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 20: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

20

Structures de controcircle - boucles FOR

bull Syntaxe FOR ltcompteurgt IN ltlimite_infgt ltlimite_supgt

commandes

END LOOP

bull Exemple

DECLARE

noEmp NUMBER (3)

BEGIN

FOR noEmp IN 1 100

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (noEmp lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END LOOP

END

21

Structures de controcircle - boucles WHILE

bull Syntaxe WHILE ltconditiongt LOOP

commandes

END LOOP bull Exemple DECLARE

noEmp_v NUMBER (3)BEGIN

noEmp_v = 1WHILE noEmp_v lt= 100 LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1 END LOOP

END

22

Structures de controcircles - remarques sur les boucles

bull Ne pas modifier le compteur drsquoune boucle FORbull Les boucles peuvent ecirctre imbriqueacuteesbull On peut nommer les boucles pour identifier explicitement laquelle de deux

boucles imbriqueacutees se termine ltltboucleExternegtgtLOOP

EXIT WHEN compteur_v = 10 ltltboucleInternegtgt

LOOP EXIT boucleExterne WHEN compteur_v = 100 EXIT boucleInterne WHEN drapeau_v = TRUE

END LOOP boucleInterne END LOOP boucleExterne

23

Interactions avec le serveur Oracle

bull Inclure une requecircte SELECT dans un block PLSQL

bull Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull Modifier des donneacutees dans PLSQL

bull Controcircler les transactions dans PLSQL

bull Deacuteterminer le reacutesultat drsquoune requecircte SELECT dans PLSQL

24

Inclure une requecircte SELECT dans PLSQL

DECLARE

noDept_v NUMBER(2)

lieu_v VARCHAR2(15)

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

ATTENTION la requecircte ne doit retourner que un et un seul tuple Si ce nrsquoest pas le cas les exceptions NO_DATA_FOUND ou TOO_MANY_ROWS sont leveacutees

25

Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull TYPE identifie dynamiquement le type drsquoun attribut drsquoune table

bull ROWTYPEidentifie dynamiquement le type (structureacute) drsquoun tuple drsquoune table

DECLAREdateCommande_v CommandedateCommandeTYPE uneCommande_v CommandeROWTYPE

26

Exemple requecircte SELECT dans PLSQL

DECLARE

noDept_v DepartementnoDeptTYPE

lieu_v DepartementlieuTYPE

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

27

Exemple requecircte SELECT dans PLSQL

DECLARE

sommeSalaires_v EmployesalaireTYPE

noDept_v NUMBER NOT NULL = 10

BEGIN

SELECT SUM(salaire)

INTO sommeSalaires_v

FROM Employe

WHERE noDepartement = noDept_v

END

28

Modifier des donneacutees dans PLSQL

bull Trois commandes du langage de manipulation de donneacutees (LMD) de SQL permettent de modifier une base de donneacutees ndash INSERT

ndash UPDATE

ndash DELETE

29

Modifier des donneacutees dans PLSQL (INSERT)

BEGIN

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (10 lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END

bull Note ndash on peut eacutevidemment utiliser des variables au lieu de simples valeurs

preacutedeacutefinies

30

Modifier des donneacutees dans PLSQL (UPDATE)

DECLAREmajorationSalaire_v EmployesalaireTYPE = 2000

BEGINUPDATE EmployeSET salaire = salaire + majorationSalaire_vWHERE job = lsquoPROGRAMMEURrsquo

END

bull Note ndash contrairement aux affectations PLSQL la clause update utilise le signe

lsquo=lsquo comme opeacuterateur drsquoaffectationndash si une variable a le mecircme nom qursquoun nom drsquoattribut de la table manipuleacutee

dans la clause WHERE le serveur Oracle utilise en prioriteacute lrsquoattribut de table

31

Modifier des donneacutees dans PLSQL (DELETE)

DECLARE

noDept_v EmployenoDeptTYPE = 10

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

END

32

Controcircler les transactions dans PLSQL

bull La premiegravere commande INSERTUPDATEDELETECREATEDROP drsquoun block entamme une nouvelle transaction

bull La fin du block ne termine pas la transactionbull Pour terminer explicitement une transaction utiliser les commandes SQL

ndash COMMIT=gt valide les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

ndash ROLLBACK=gt annule toutes les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

bull Note Une transaction doit ecirctre un ensemble homogegravene de manipulations de la base de donneacutees =gt il faut reacuteflechir agrave tous les endroits ougrave il est leacutegitime de mettre un COMMIT

33

Controcircler les transactions dans PLSQL

DECLARE

noDept_v EmployenoDeptTYPE = 10

majorationSalaire_v EmployesalaireTYPE = 2000

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

COMMIT

UPDATE Employe

SET salaire = salaire + majorationSalaire_v

WHERE job = lsquoPROGRAMMEURrsquo

END

34

Affichage des donneacutees

Option

set serveroutput on cette option permet drsquoactiver lrsquoaffichage des donneacutees dans lrsquooutil sqlplus

Pour afficher un message ou une variable

DBMS_OUTPUTPUT_LINE(lsquomessagersquo)

35

Gestion des exceptionstraitement des erreurs

36

Gestion des exceptions

37

Gestion des exceptions Exemple

38

Gestion des curseurs

bull Neacutecessite lrsquoutilisation de curseurs

Les curseurs sont des zones de travail priveacutees ce sont des zones meacutemoire utiliseacutees pour analyser et interpreacuteter tout ordre SQL

bull Deux types de curseurs

bull les curseurs implicites

Le serveur Oracle utilise des curseurs implicites pour exeacutecuter les requecirctes SQL

bull les curseurs explicites

sont des variables explicitement deacuteclareacutees par le programmeur

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 21: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

21

Structures de controcircle - boucles WHILE

bull Syntaxe WHILE ltconditiongt LOOP

commandes

END LOOP bull Exemple DECLARE

noEmp_v NUMBER (3)BEGIN

noEmp_v = 1WHILE noEmp_v lt= 100 LOOP

INSERT INTO Employe (noEmp nomEmp job noDept)VALUES (noEmp_v lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

noEmp_v = noEmp_v +1 END LOOP

END

22

Structures de controcircles - remarques sur les boucles

bull Ne pas modifier le compteur drsquoune boucle FORbull Les boucles peuvent ecirctre imbriqueacuteesbull On peut nommer les boucles pour identifier explicitement laquelle de deux

boucles imbriqueacutees se termine ltltboucleExternegtgtLOOP

EXIT WHEN compteur_v = 10 ltltboucleInternegtgt

LOOP EXIT boucleExterne WHEN compteur_v = 100 EXIT boucleInterne WHEN drapeau_v = TRUE

END LOOP boucleInterne END LOOP boucleExterne

23

Interactions avec le serveur Oracle

bull Inclure une requecircte SELECT dans un block PLSQL

bull Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull Modifier des donneacutees dans PLSQL

bull Controcircler les transactions dans PLSQL

bull Deacuteterminer le reacutesultat drsquoune requecircte SELECT dans PLSQL

24

Inclure une requecircte SELECT dans PLSQL

DECLARE

noDept_v NUMBER(2)

lieu_v VARCHAR2(15)

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

ATTENTION la requecircte ne doit retourner que un et un seul tuple Si ce nrsquoest pas le cas les exceptions NO_DATA_FOUND ou TOO_MANY_ROWS sont leveacutees

25

Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull TYPE identifie dynamiquement le type drsquoun attribut drsquoune table

bull ROWTYPEidentifie dynamiquement le type (structureacute) drsquoun tuple drsquoune table

DECLAREdateCommande_v CommandedateCommandeTYPE uneCommande_v CommandeROWTYPE

26

Exemple requecircte SELECT dans PLSQL

DECLARE

noDept_v DepartementnoDeptTYPE

lieu_v DepartementlieuTYPE

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

27

Exemple requecircte SELECT dans PLSQL

DECLARE

sommeSalaires_v EmployesalaireTYPE

noDept_v NUMBER NOT NULL = 10

BEGIN

SELECT SUM(salaire)

INTO sommeSalaires_v

FROM Employe

WHERE noDepartement = noDept_v

END

28

Modifier des donneacutees dans PLSQL

bull Trois commandes du langage de manipulation de donneacutees (LMD) de SQL permettent de modifier une base de donneacutees ndash INSERT

ndash UPDATE

ndash DELETE

29

Modifier des donneacutees dans PLSQL (INSERT)

BEGIN

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (10 lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END

bull Note ndash on peut eacutevidemment utiliser des variables au lieu de simples valeurs

preacutedeacutefinies

30

Modifier des donneacutees dans PLSQL (UPDATE)

DECLAREmajorationSalaire_v EmployesalaireTYPE = 2000

BEGINUPDATE EmployeSET salaire = salaire + majorationSalaire_vWHERE job = lsquoPROGRAMMEURrsquo

END

bull Note ndash contrairement aux affectations PLSQL la clause update utilise le signe

lsquo=lsquo comme opeacuterateur drsquoaffectationndash si une variable a le mecircme nom qursquoun nom drsquoattribut de la table manipuleacutee

dans la clause WHERE le serveur Oracle utilise en prioriteacute lrsquoattribut de table

31

Modifier des donneacutees dans PLSQL (DELETE)

DECLARE

noDept_v EmployenoDeptTYPE = 10

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

END

32

Controcircler les transactions dans PLSQL

bull La premiegravere commande INSERTUPDATEDELETECREATEDROP drsquoun block entamme une nouvelle transaction

bull La fin du block ne termine pas la transactionbull Pour terminer explicitement une transaction utiliser les commandes SQL

ndash COMMIT=gt valide les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

ndash ROLLBACK=gt annule toutes les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

bull Note Une transaction doit ecirctre un ensemble homogegravene de manipulations de la base de donneacutees =gt il faut reacuteflechir agrave tous les endroits ougrave il est leacutegitime de mettre un COMMIT

33

Controcircler les transactions dans PLSQL

DECLARE

noDept_v EmployenoDeptTYPE = 10

majorationSalaire_v EmployesalaireTYPE = 2000

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

COMMIT

UPDATE Employe

SET salaire = salaire + majorationSalaire_v

WHERE job = lsquoPROGRAMMEURrsquo

END

34

Affichage des donneacutees

Option

set serveroutput on cette option permet drsquoactiver lrsquoaffichage des donneacutees dans lrsquooutil sqlplus

Pour afficher un message ou une variable

DBMS_OUTPUTPUT_LINE(lsquomessagersquo)

35

Gestion des exceptionstraitement des erreurs

36

Gestion des exceptions

37

Gestion des exceptions Exemple

38

Gestion des curseurs

bull Neacutecessite lrsquoutilisation de curseurs

Les curseurs sont des zones de travail priveacutees ce sont des zones meacutemoire utiliseacutees pour analyser et interpreacuteter tout ordre SQL

bull Deux types de curseurs

bull les curseurs implicites

Le serveur Oracle utilise des curseurs implicites pour exeacutecuter les requecirctes SQL

bull les curseurs explicites

sont des variables explicitement deacuteclareacutees par le programmeur

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 22: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

22

Structures de controcircles - remarques sur les boucles

bull Ne pas modifier le compteur drsquoune boucle FORbull Les boucles peuvent ecirctre imbriqueacuteesbull On peut nommer les boucles pour identifier explicitement laquelle de deux

boucles imbriqueacutees se termine ltltboucleExternegtgtLOOP

EXIT WHEN compteur_v = 10 ltltboucleInternegtgt

LOOP EXIT boucleExterne WHEN compteur_v = 100 EXIT boucleInterne WHEN drapeau_v = TRUE

END LOOP boucleInterne END LOOP boucleExterne

23

Interactions avec le serveur Oracle

bull Inclure une requecircte SELECT dans un block PLSQL

bull Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull Modifier des donneacutees dans PLSQL

bull Controcircler les transactions dans PLSQL

bull Deacuteterminer le reacutesultat drsquoune requecircte SELECT dans PLSQL

24

Inclure une requecircte SELECT dans PLSQL

DECLARE

noDept_v NUMBER(2)

lieu_v VARCHAR2(15)

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

ATTENTION la requecircte ne doit retourner que un et un seul tuple Si ce nrsquoest pas le cas les exceptions NO_DATA_FOUND ou TOO_MANY_ROWS sont leveacutees

25

Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull TYPE identifie dynamiquement le type drsquoun attribut drsquoune table

bull ROWTYPEidentifie dynamiquement le type (structureacute) drsquoun tuple drsquoune table

DECLAREdateCommande_v CommandedateCommandeTYPE uneCommande_v CommandeROWTYPE

26

Exemple requecircte SELECT dans PLSQL

DECLARE

noDept_v DepartementnoDeptTYPE

lieu_v DepartementlieuTYPE

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

27

Exemple requecircte SELECT dans PLSQL

DECLARE

sommeSalaires_v EmployesalaireTYPE

noDept_v NUMBER NOT NULL = 10

BEGIN

SELECT SUM(salaire)

INTO sommeSalaires_v

FROM Employe

WHERE noDepartement = noDept_v

END

28

Modifier des donneacutees dans PLSQL

bull Trois commandes du langage de manipulation de donneacutees (LMD) de SQL permettent de modifier une base de donneacutees ndash INSERT

ndash UPDATE

ndash DELETE

29

Modifier des donneacutees dans PLSQL (INSERT)

BEGIN

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (10 lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END

bull Note ndash on peut eacutevidemment utiliser des variables au lieu de simples valeurs

preacutedeacutefinies

30

Modifier des donneacutees dans PLSQL (UPDATE)

DECLAREmajorationSalaire_v EmployesalaireTYPE = 2000

BEGINUPDATE EmployeSET salaire = salaire + majorationSalaire_vWHERE job = lsquoPROGRAMMEURrsquo

END

bull Note ndash contrairement aux affectations PLSQL la clause update utilise le signe

lsquo=lsquo comme opeacuterateur drsquoaffectationndash si une variable a le mecircme nom qursquoun nom drsquoattribut de la table manipuleacutee

dans la clause WHERE le serveur Oracle utilise en prioriteacute lrsquoattribut de table

31

Modifier des donneacutees dans PLSQL (DELETE)

DECLARE

noDept_v EmployenoDeptTYPE = 10

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

END

32

Controcircler les transactions dans PLSQL

bull La premiegravere commande INSERTUPDATEDELETECREATEDROP drsquoun block entamme une nouvelle transaction

bull La fin du block ne termine pas la transactionbull Pour terminer explicitement une transaction utiliser les commandes SQL

ndash COMMIT=gt valide les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

ndash ROLLBACK=gt annule toutes les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

bull Note Une transaction doit ecirctre un ensemble homogegravene de manipulations de la base de donneacutees =gt il faut reacuteflechir agrave tous les endroits ougrave il est leacutegitime de mettre un COMMIT

33

Controcircler les transactions dans PLSQL

DECLARE

noDept_v EmployenoDeptTYPE = 10

majorationSalaire_v EmployesalaireTYPE = 2000

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

COMMIT

UPDATE Employe

SET salaire = salaire + majorationSalaire_v

WHERE job = lsquoPROGRAMMEURrsquo

END

34

Affichage des donneacutees

Option

set serveroutput on cette option permet drsquoactiver lrsquoaffichage des donneacutees dans lrsquooutil sqlplus

Pour afficher un message ou une variable

DBMS_OUTPUTPUT_LINE(lsquomessagersquo)

35

Gestion des exceptionstraitement des erreurs

36

Gestion des exceptions

37

Gestion des exceptions Exemple

38

Gestion des curseurs

bull Neacutecessite lrsquoutilisation de curseurs

Les curseurs sont des zones de travail priveacutees ce sont des zones meacutemoire utiliseacutees pour analyser et interpreacuteter tout ordre SQL

bull Deux types de curseurs

bull les curseurs implicites

Le serveur Oracle utilise des curseurs implicites pour exeacutecuter les requecirctes SQL

bull les curseurs explicites

sont des variables explicitement deacuteclareacutees par le programmeur

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 23: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

23

Interactions avec le serveur Oracle

bull Inclure une requecircte SELECT dans un block PLSQL

bull Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull Modifier des donneacutees dans PLSQL

bull Controcircler les transactions dans PLSQL

bull Deacuteterminer le reacutesultat drsquoune requecircte SELECT dans PLSQL

24

Inclure une requecircte SELECT dans PLSQL

DECLARE

noDept_v NUMBER(2)

lieu_v VARCHAR2(15)

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

ATTENTION la requecircte ne doit retourner que un et un seul tuple Si ce nrsquoest pas le cas les exceptions NO_DATA_FOUND ou TOO_MANY_ROWS sont leveacutees

25

Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull TYPE identifie dynamiquement le type drsquoun attribut drsquoune table

bull ROWTYPEidentifie dynamiquement le type (structureacute) drsquoun tuple drsquoune table

DECLAREdateCommande_v CommandedateCommandeTYPE uneCommande_v CommandeROWTYPE

26

Exemple requecircte SELECT dans PLSQL

DECLARE

noDept_v DepartementnoDeptTYPE

lieu_v DepartementlieuTYPE

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

27

Exemple requecircte SELECT dans PLSQL

DECLARE

sommeSalaires_v EmployesalaireTYPE

noDept_v NUMBER NOT NULL = 10

BEGIN

SELECT SUM(salaire)

INTO sommeSalaires_v

FROM Employe

WHERE noDepartement = noDept_v

END

28

Modifier des donneacutees dans PLSQL

bull Trois commandes du langage de manipulation de donneacutees (LMD) de SQL permettent de modifier une base de donneacutees ndash INSERT

ndash UPDATE

ndash DELETE

29

Modifier des donneacutees dans PLSQL (INSERT)

BEGIN

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (10 lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END

bull Note ndash on peut eacutevidemment utiliser des variables au lieu de simples valeurs

preacutedeacutefinies

30

Modifier des donneacutees dans PLSQL (UPDATE)

DECLAREmajorationSalaire_v EmployesalaireTYPE = 2000

BEGINUPDATE EmployeSET salaire = salaire + majorationSalaire_vWHERE job = lsquoPROGRAMMEURrsquo

END

bull Note ndash contrairement aux affectations PLSQL la clause update utilise le signe

lsquo=lsquo comme opeacuterateur drsquoaffectationndash si une variable a le mecircme nom qursquoun nom drsquoattribut de la table manipuleacutee

dans la clause WHERE le serveur Oracle utilise en prioriteacute lrsquoattribut de table

31

Modifier des donneacutees dans PLSQL (DELETE)

DECLARE

noDept_v EmployenoDeptTYPE = 10

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

END

32

Controcircler les transactions dans PLSQL

bull La premiegravere commande INSERTUPDATEDELETECREATEDROP drsquoun block entamme une nouvelle transaction

bull La fin du block ne termine pas la transactionbull Pour terminer explicitement une transaction utiliser les commandes SQL

ndash COMMIT=gt valide les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

ndash ROLLBACK=gt annule toutes les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

bull Note Une transaction doit ecirctre un ensemble homogegravene de manipulations de la base de donneacutees =gt il faut reacuteflechir agrave tous les endroits ougrave il est leacutegitime de mettre un COMMIT

33

Controcircler les transactions dans PLSQL

DECLARE

noDept_v EmployenoDeptTYPE = 10

majorationSalaire_v EmployesalaireTYPE = 2000

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

COMMIT

UPDATE Employe

SET salaire = salaire + majorationSalaire_v

WHERE job = lsquoPROGRAMMEURrsquo

END

34

Affichage des donneacutees

Option

set serveroutput on cette option permet drsquoactiver lrsquoaffichage des donneacutees dans lrsquooutil sqlplus

Pour afficher un message ou une variable

DBMS_OUTPUTPUT_LINE(lsquomessagersquo)

35

Gestion des exceptionstraitement des erreurs

36

Gestion des exceptions

37

Gestion des exceptions Exemple

38

Gestion des curseurs

bull Neacutecessite lrsquoutilisation de curseurs

Les curseurs sont des zones de travail priveacutees ce sont des zones meacutemoire utiliseacutees pour analyser et interpreacuteter tout ordre SQL

bull Deux types de curseurs

bull les curseurs implicites

Le serveur Oracle utilise des curseurs implicites pour exeacutecuter les requecirctes SQL

bull les curseurs explicites

sont des variables explicitement deacuteclareacutees par le programmeur

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 24: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

24

Inclure une requecircte SELECT dans PLSQL

DECLARE

noDept_v NUMBER(2)

lieu_v VARCHAR2(15)

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

ATTENTION la requecircte ne doit retourner que un et un seul tuple Si ce nrsquoest pas le cas les exceptions NO_DATA_FOUND ou TOO_MANY_ROWS sont leveacutees

25

Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull TYPE identifie dynamiquement le type drsquoun attribut drsquoune table

bull ROWTYPEidentifie dynamiquement le type (structureacute) drsquoun tuple drsquoune table

DECLAREdateCommande_v CommandedateCommandeTYPE uneCommande_v CommandeROWTYPE

26

Exemple requecircte SELECT dans PLSQL

DECLARE

noDept_v DepartementnoDeptTYPE

lieu_v DepartementlieuTYPE

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

27

Exemple requecircte SELECT dans PLSQL

DECLARE

sommeSalaires_v EmployesalaireTYPE

noDept_v NUMBER NOT NULL = 10

BEGIN

SELECT SUM(salaire)

INTO sommeSalaires_v

FROM Employe

WHERE noDepartement = noDept_v

END

28

Modifier des donneacutees dans PLSQL

bull Trois commandes du langage de manipulation de donneacutees (LMD) de SQL permettent de modifier une base de donneacutees ndash INSERT

ndash UPDATE

ndash DELETE

29

Modifier des donneacutees dans PLSQL (INSERT)

BEGIN

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (10 lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END

bull Note ndash on peut eacutevidemment utiliser des variables au lieu de simples valeurs

preacutedeacutefinies

30

Modifier des donneacutees dans PLSQL (UPDATE)

DECLAREmajorationSalaire_v EmployesalaireTYPE = 2000

BEGINUPDATE EmployeSET salaire = salaire + majorationSalaire_vWHERE job = lsquoPROGRAMMEURrsquo

END

bull Note ndash contrairement aux affectations PLSQL la clause update utilise le signe

lsquo=lsquo comme opeacuterateur drsquoaffectationndash si une variable a le mecircme nom qursquoun nom drsquoattribut de la table manipuleacutee

dans la clause WHERE le serveur Oracle utilise en prioriteacute lrsquoattribut de table

31

Modifier des donneacutees dans PLSQL (DELETE)

DECLARE

noDept_v EmployenoDeptTYPE = 10

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

END

32

Controcircler les transactions dans PLSQL

bull La premiegravere commande INSERTUPDATEDELETECREATEDROP drsquoun block entamme une nouvelle transaction

bull La fin du block ne termine pas la transactionbull Pour terminer explicitement une transaction utiliser les commandes SQL

ndash COMMIT=gt valide les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

ndash ROLLBACK=gt annule toutes les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

bull Note Une transaction doit ecirctre un ensemble homogegravene de manipulations de la base de donneacutees =gt il faut reacuteflechir agrave tous les endroits ougrave il est leacutegitime de mettre un COMMIT

33

Controcircler les transactions dans PLSQL

DECLARE

noDept_v EmployenoDeptTYPE = 10

majorationSalaire_v EmployesalaireTYPE = 2000

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

COMMIT

UPDATE Employe

SET salaire = salaire + majorationSalaire_v

WHERE job = lsquoPROGRAMMEURrsquo

END

34

Affichage des donneacutees

Option

set serveroutput on cette option permet drsquoactiver lrsquoaffichage des donneacutees dans lrsquooutil sqlplus

Pour afficher un message ou une variable

DBMS_OUTPUTPUT_LINE(lsquomessagersquo)

35

Gestion des exceptionstraitement des erreurs

36

Gestion des exceptions

37

Gestion des exceptions Exemple

38

Gestion des curseurs

bull Neacutecessite lrsquoutilisation de curseurs

Les curseurs sont des zones de travail priveacutees ce sont des zones meacutemoire utiliseacutees pour analyser et interpreacuteter tout ordre SQL

bull Deux types de curseurs

bull les curseurs implicites

Le serveur Oracle utilise des curseurs implicites pour exeacutecuter les requecirctes SQL

bull les curseurs explicites

sont des variables explicitement deacuteclareacutees par le programmeur

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 25: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

25

Deacuteclarer dynamiquement des variables de type adapteacute au SELECT

bull TYPE identifie dynamiquement le type drsquoun attribut drsquoune table

bull ROWTYPEidentifie dynamiquement le type (structureacute) drsquoun tuple drsquoune table

DECLAREdateCommande_v CommandedateCommandeTYPE uneCommande_v CommandeROWTYPE

26

Exemple requecircte SELECT dans PLSQL

DECLARE

noDept_v DepartementnoDeptTYPE

lieu_v DepartementlieuTYPE

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

27

Exemple requecircte SELECT dans PLSQL

DECLARE

sommeSalaires_v EmployesalaireTYPE

noDept_v NUMBER NOT NULL = 10

BEGIN

SELECT SUM(salaire)

INTO sommeSalaires_v

FROM Employe

WHERE noDepartement = noDept_v

END

28

Modifier des donneacutees dans PLSQL

bull Trois commandes du langage de manipulation de donneacutees (LMD) de SQL permettent de modifier une base de donneacutees ndash INSERT

ndash UPDATE

ndash DELETE

29

Modifier des donneacutees dans PLSQL (INSERT)

BEGIN

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (10 lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END

bull Note ndash on peut eacutevidemment utiliser des variables au lieu de simples valeurs

preacutedeacutefinies

30

Modifier des donneacutees dans PLSQL (UPDATE)

DECLAREmajorationSalaire_v EmployesalaireTYPE = 2000

BEGINUPDATE EmployeSET salaire = salaire + majorationSalaire_vWHERE job = lsquoPROGRAMMEURrsquo

END

bull Note ndash contrairement aux affectations PLSQL la clause update utilise le signe

lsquo=lsquo comme opeacuterateur drsquoaffectationndash si une variable a le mecircme nom qursquoun nom drsquoattribut de la table manipuleacutee

dans la clause WHERE le serveur Oracle utilise en prioriteacute lrsquoattribut de table

31

Modifier des donneacutees dans PLSQL (DELETE)

DECLARE

noDept_v EmployenoDeptTYPE = 10

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

END

32

Controcircler les transactions dans PLSQL

bull La premiegravere commande INSERTUPDATEDELETECREATEDROP drsquoun block entamme une nouvelle transaction

bull La fin du block ne termine pas la transactionbull Pour terminer explicitement une transaction utiliser les commandes SQL

ndash COMMIT=gt valide les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

ndash ROLLBACK=gt annule toutes les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

bull Note Une transaction doit ecirctre un ensemble homogegravene de manipulations de la base de donneacutees =gt il faut reacuteflechir agrave tous les endroits ougrave il est leacutegitime de mettre un COMMIT

33

Controcircler les transactions dans PLSQL

DECLARE

noDept_v EmployenoDeptTYPE = 10

majorationSalaire_v EmployesalaireTYPE = 2000

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

COMMIT

UPDATE Employe

SET salaire = salaire + majorationSalaire_v

WHERE job = lsquoPROGRAMMEURrsquo

END

34

Affichage des donneacutees

Option

set serveroutput on cette option permet drsquoactiver lrsquoaffichage des donneacutees dans lrsquooutil sqlplus

Pour afficher un message ou une variable

DBMS_OUTPUTPUT_LINE(lsquomessagersquo)

35

Gestion des exceptionstraitement des erreurs

36

Gestion des exceptions

37

Gestion des exceptions Exemple

38

Gestion des curseurs

bull Neacutecessite lrsquoutilisation de curseurs

Les curseurs sont des zones de travail priveacutees ce sont des zones meacutemoire utiliseacutees pour analyser et interpreacuteter tout ordre SQL

bull Deux types de curseurs

bull les curseurs implicites

Le serveur Oracle utilise des curseurs implicites pour exeacutecuter les requecirctes SQL

bull les curseurs explicites

sont des variables explicitement deacuteclareacutees par le programmeur

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 26: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

26

Exemple requecircte SELECT dans PLSQL

DECLARE

noDept_v DepartementnoDeptTYPE

lieu_v DepartementlieuTYPE

BEGIN

SELECT noDept lieu

INTO noDept_v lieu_v

FROM Departement

WHERE nomDept = lsquoVENTESrsquo

END

27

Exemple requecircte SELECT dans PLSQL

DECLARE

sommeSalaires_v EmployesalaireTYPE

noDept_v NUMBER NOT NULL = 10

BEGIN

SELECT SUM(salaire)

INTO sommeSalaires_v

FROM Employe

WHERE noDepartement = noDept_v

END

28

Modifier des donneacutees dans PLSQL

bull Trois commandes du langage de manipulation de donneacutees (LMD) de SQL permettent de modifier une base de donneacutees ndash INSERT

ndash UPDATE

ndash DELETE

29

Modifier des donneacutees dans PLSQL (INSERT)

BEGIN

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (10 lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END

bull Note ndash on peut eacutevidemment utiliser des variables au lieu de simples valeurs

preacutedeacutefinies

30

Modifier des donneacutees dans PLSQL (UPDATE)

DECLAREmajorationSalaire_v EmployesalaireTYPE = 2000

BEGINUPDATE EmployeSET salaire = salaire + majorationSalaire_vWHERE job = lsquoPROGRAMMEURrsquo

END

bull Note ndash contrairement aux affectations PLSQL la clause update utilise le signe

lsquo=lsquo comme opeacuterateur drsquoaffectationndash si une variable a le mecircme nom qursquoun nom drsquoattribut de la table manipuleacutee

dans la clause WHERE le serveur Oracle utilise en prioriteacute lrsquoattribut de table

31

Modifier des donneacutees dans PLSQL (DELETE)

DECLARE

noDept_v EmployenoDeptTYPE = 10

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

END

32

Controcircler les transactions dans PLSQL

bull La premiegravere commande INSERTUPDATEDELETECREATEDROP drsquoun block entamme une nouvelle transaction

bull La fin du block ne termine pas la transactionbull Pour terminer explicitement une transaction utiliser les commandes SQL

ndash COMMIT=gt valide les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

ndash ROLLBACK=gt annule toutes les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

bull Note Une transaction doit ecirctre un ensemble homogegravene de manipulations de la base de donneacutees =gt il faut reacuteflechir agrave tous les endroits ougrave il est leacutegitime de mettre un COMMIT

33

Controcircler les transactions dans PLSQL

DECLARE

noDept_v EmployenoDeptTYPE = 10

majorationSalaire_v EmployesalaireTYPE = 2000

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

COMMIT

UPDATE Employe

SET salaire = salaire + majorationSalaire_v

WHERE job = lsquoPROGRAMMEURrsquo

END

34

Affichage des donneacutees

Option

set serveroutput on cette option permet drsquoactiver lrsquoaffichage des donneacutees dans lrsquooutil sqlplus

Pour afficher un message ou une variable

DBMS_OUTPUTPUT_LINE(lsquomessagersquo)

35

Gestion des exceptionstraitement des erreurs

36

Gestion des exceptions

37

Gestion des exceptions Exemple

38

Gestion des curseurs

bull Neacutecessite lrsquoutilisation de curseurs

Les curseurs sont des zones de travail priveacutees ce sont des zones meacutemoire utiliseacutees pour analyser et interpreacuteter tout ordre SQL

bull Deux types de curseurs

bull les curseurs implicites

Le serveur Oracle utilise des curseurs implicites pour exeacutecuter les requecirctes SQL

bull les curseurs explicites

sont des variables explicitement deacuteclareacutees par le programmeur

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 27: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

27

Exemple requecircte SELECT dans PLSQL

DECLARE

sommeSalaires_v EmployesalaireTYPE

noDept_v NUMBER NOT NULL = 10

BEGIN

SELECT SUM(salaire)

INTO sommeSalaires_v

FROM Employe

WHERE noDepartement = noDept_v

END

28

Modifier des donneacutees dans PLSQL

bull Trois commandes du langage de manipulation de donneacutees (LMD) de SQL permettent de modifier une base de donneacutees ndash INSERT

ndash UPDATE

ndash DELETE

29

Modifier des donneacutees dans PLSQL (INSERT)

BEGIN

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (10 lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END

bull Note ndash on peut eacutevidemment utiliser des variables au lieu de simples valeurs

preacutedeacutefinies

30

Modifier des donneacutees dans PLSQL (UPDATE)

DECLAREmajorationSalaire_v EmployesalaireTYPE = 2000

BEGINUPDATE EmployeSET salaire = salaire + majorationSalaire_vWHERE job = lsquoPROGRAMMEURrsquo

END

bull Note ndash contrairement aux affectations PLSQL la clause update utilise le signe

lsquo=lsquo comme opeacuterateur drsquoaffectationndash si une variable a le mecircme nom qursquoun nom drsquoattribut de la table manipuleacutee

dans la clause WHERE le serveur Oracle utilise en prioriteacute lrsquoattribut de table

31

Modifier des donneacutees dans PLSQL (DELETE)

DECLARE

noDept_v EmployenoDeptTYPE = 10

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

END

32

Controcircler les transactions dans PLSQL

bull La premiegravere commande INSERTUPDATEDELETECREATEDROP drsquoun block entamme une nouvelle transaction

bull La fin du block ne termine pas la transactionbull Pour terminer explicitement une transaction utiliser les commandes SQL

ndash COMMIT=gt valide les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

ndash ROLLBACK=gt annule toutes les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

bull Note Une transaction doit ecirctre un ensemble homogegravene de manipulations de la base de donneacutees =gt il faut reacuteflechir agrave tous les endroits ougrave il est leacutegitime de mettre un COMMIT

33

Controcircler les transactions dans PLSQL

DECLARE

noDept_v EmployenoDeptTYPE = 10

majorationSalaire_v EmployesalaireTYPE = 2000

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

COMMIT

UPDATE Employe

SET salaire = salaire + majorationSalaire_v

WHERE job = lsquoPROGRAMMEURrsquo

END

34

Affichage des donneacutees

Option

set serveroutput on cette option permet drsquoactiver lrsquoaffichage des donneacutees dans lrsquooutil sqlplus

Pour afficher un message ou une variable

DBMS_OUTPUTPUT_LINE(lsquomessagersquo)

35

Gestion des exceptionstraitement des erreurs

36

Gestion des exceptions

37

Gestion des exceptions Exemple

38

Gestion des curseurs

bull Neacutecessite lrsquoutilisation de curseurs

Les curseurs sont des zones de travail priveacutees ce sont des zones meacutemoire utiliseacutees pour analyser et interpreacuteter tout ordre SQL

bull Deux types de curseurs

bull les curseurs implicites

Le serveur Oracle utilise des curseurs implicites pour exeacutecuter les requecirctes SQL

bull les curseurs explicites

sont des variables explicitement deacuteclareacutees par le programmeur

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 28: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

28

Modifier des donneacutees dans PLSQL

bull Trois commandes du langage de manipulation de donneacutees (LMD) de SQL permettent de modifier une base de donneacutees ndash INSERT

ndash UPDATE

ndash DELETE

29

Modifier des donneacutees dans PLSQL (INSERT)

BEGIN

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (10 lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END

bull Note ndash on peut eacutevidemment utiliser des variables au lieu de simples valeurs

preacutedeacutefinies

30

Modifier des donneacutees dans PLSQL (UPDATE)

DECLAREmajorationSalaire_v EmployesalaireTYPE = 2000

BEGINUPDATE EmployeSET salaire = salaire + majorationSalaire_vWHERE job = lsquoPROGRAMMEURrsquo

END

bull Note ndash contrairement aux affectations PLSQL la clause update utilise le signe

lsquo=lsquo comme opeacuterateur drsquoaffectationndash si une variable a le mecircme nom qursquoun nom drsquoattribut de la table manipuleacutee

dans la clause WHERE le serveur Oracle utilise en prioriteacute lrsquoattribut de table

31

Modifier des donneacutees dans PLSQL (DELETE)

DECLARE

noDept_v EmployenoDeptTYPE = 10

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

END

32

Controcircler les transactions dans PLSQL

bull La premiegravere commande INSERTUPDATEDELETECREATEDROP drsquoun block entamme une nouvelle transaction

bull La fin du block ne termine pas la transactionbull Pour terminer explicitement une transaction utiliser les commandes SQL

ndash COMMIT=gt valide les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

ndash ROLLBACK=gt annule toutes les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

bull Note Une transaction doit ecirctre un ensemble homogegravene de manipulations de la base de donneacutees =gt il faut reacuteflechir agrave tous les endroits ougrave il est leacutegitime de mettre un COMMIT

33

Controcircler les transactions dans PLSQL

DECLARE

noDept_v EmployenoDeptTYPE = 10

majorationSalaire_v EmployesalaireTYPE = 2000

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

COMMIT

UPDATE Employe

SET salaire = salaire + majorationSalaire_v

WHERE job = lsquoPROGRAMMEURrsquo

END

34

Affichage des donneacutees

Option

set serveroutput on cette option permet drsquoactiver lrsquoaffichage des donneacutees dans lrsquooutil sqlplus

Pour afficher un message ou une variable

DBMS_OUTPUTPUT_LINE(lsquomessagersquo)

35

Gestion des exceptionstraitement des erreurs

36

Gestion des exceptions

37

Gestion des exceptions Exemple

38

Gestion des curseurs

bull Neacutecessite lrsquoutilisation de curseurs

Les curseurs sont des zones de travail priveacutees ce sont des zones meacutemoire utiliseacutees pour analyser et interpreacuteter tout ordre SQL

bull Deux types de curseurs

bull les curseurs implicites

Le serveur Oracle utilise des curseurs implicites pour exeacutecuter les requecirctes SQL

bull les curseurs explicites

sont des variables explicitement deacuteclareacutees par le programmeur

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 29: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

29

Modifier des donneacutees dans PLSQL (INSERT)

BEGIN

INSERT INTO Employe (noEmp nomEmp job noDept)

VALUES (10 lsquoOraclersquo lsquoPROGRAMMEURrsquo 10)

END

bull Note ndash on peut eacutevidemment utiliser des variables au lieu de simples valeurs

preacutedeacutefinies

30

Modifier des donneacutees dans PLSQL (UPDATE)

DECLAREmajorationSalaire_v EmployesalaireTYPE = 2000

BEGINUPDATE EmployeSET salaire = salaire + majorationSalaire_vWHERE job = lsquoPROGRAMMEURrsquo

END

bull Note ndash contrairement aux affectations PLSQL la clause update utilise le signe

lsquo=lsquo comme opeacuterateur drsquoaffectationndash si une variable a le mecircme nom qursquoun nom drsquoattribut de la table manipuleacutee

dans la clause WHERE le serveur Oracle utilise en prioriteacute lrsquoattribut de table

31

Modifier des donneacutees dans PLSQL (DELETE)

DECLARE

noDept_v EmployenoDeptTYPE = 10

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

END

32

Controcircler les transactions dans PLSQL

bull La premiegravere commande INSERTUPDATEDELETECREATEDROP drsquoun block entamme une nouvelle transaction

bull La fin du block ne termine pas la transactionbull Pour terminer explicitement une transaction utiliser les commandes SQL

ndash COMMIT=gt valide les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

ndash ROLLBACK=gt annule toutes les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

bull Note Une transaction doit ecirctre un ensemble homogegravene de manipulations de la base de donneacutees =gt il faut reacuteflechir agrave tous les endroits ougrave il est leacutegitime de mettre un COMMIT

33

Controcircler les transactions dans PLSQL

DECLARE

noDept_v EmployenoDeptTYPE = 10

majorationSalaire_v EmployesalaireTYPE = 2000

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

COMMIT

UPDATE Employe

SET salaire = salaire + majorationSalaire_v

WHERE job = lsquoPROGRAMMEURrsquo

END

34

Affichage des donneacutees

Option

set serveroutput on cette option permet drsquoactiver lrsquoaffichage des donneacutees dans lrsquooutil sqlplus

Pour afficher un message ou une variable

DBMS_OUTPUTPUT_LINE(lsquomessagersquo)

35

Gestion des exceptionstraitement des erreurs

36

Gestion des exceptions

37

Gestion des exceptions Exemple

38

Gestion des curseurs

bull Neacutecessite lrsquoutilisation de curseurs

Les curseurs sont des zones de travail priveacutees ce sont des zones meacutemoire utiliseacutees pour analyser et interpreacuteter tout ordre SQL

bull Deux types de curseurs

bull les curseurs implicites

Le serveur Oracle utilise des curseurs implicites pour exeacutecuter les requecirctes SQL

bull les curseurs explicites

sont des variables explicitement deacuteclareacutees par le programmeur

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 30: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

30

Modifier des donneacutees dans PLSQL (UPDATE)

DECLAREmajorationSalaire_v EmployesalaireTYPE = 2000

BEGINUPDATE EmployeSET salaire = salaire + majorationSalaire_vWHERE job = lsquoPROGRAMMEURrsquo

END

bull Note ndash contrairement aux affectations PLSQL la clause update utilise le signe

lsquo=lsquo comme opeacuterateur drsquoaffectationndash si une variable a le mecircme nom qursquoun nom drsquoattribut de la table manipuleacutee

dans la clause WHERE le serveur Oracle utilise en prioriteacute lrsquoattribut de table

31

Modifier des donneacutees dans PLSQL (DELETE)

DECLARE

noDept_v EmployenoDeptTYPE = 10

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

END

32

Controcircler les transactions dans PLSQL

bull La premiegravere commande INSERTUPDATEDELETECREATEDROP drsquoun block entamme une nouvelle transaction

bull La fin du block ne termine pas la transactionbull Pour terminer explicitement une transaction utiliser les commandes SQL

ndash COMMIT=gt valide les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

ndash ROLLBACK=gt annule toutes les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

bull Note Une transaction doit ecirctre un ensemble homogegravene de manipulations de la base de donneacutees =gt il faut reacuteflechir agrave tous les endroits ougrave il est leacutegitime de mettre un COMMIT

33

Controcircler les transactions dans PLSQL

DECLARE

noDept_v EmployenoDeptTYPE = 10

majorationSalaire_v EmployesalaireTYPE = 2000

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

COMMIT

UPDATE Employe

SET salaire = salaire + majorationSalaire_v

WHERE job = lsquoPROGRAMMEURrsquo

END

34

Affichage des donneacutees

Option

set serveroutput on cette option permet drsquoactiver lrsquoaffichage des donneacutees dans lrsquooutil sqlplus

Pour afficher un message ou une variable

DBMS_OUTPUTPUT_LINE(lsquomessagersquo)

35

Gestion des exceptionstraitement des erreurs

36

Gestion des exceptions

37

Gestion des exceptions Exemple

38

Gestion des curseurs

bull Neacutecessite lrsquoutilisation de curseurs

Les curseurs sont des zones de travail priveacutees ce sont des zones meacutemoire utiliseacutees pour analyser et interpreacuteter tout ordre SQL

bull Deux types de curseurs

bull les curseurs implicites

Le serveur Oracle utilise des curseurs implicites pour exeacutecuter les requecirctes SQL

bull les curseurs explicites

sont des variables explicitement deacuteclareacutees par le programmeur

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 31: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

31

Modifier des donneacutees dans PLSQL (DELETE)

DECLARE

noDept_v EmployenoDeptTYPE = 10

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

END

32

Controcircler les transactions dans PLSQL

bull La premiegravere commande INSERTUPDATEDELETECREATEDROP drsquoun block entamme une nouvelle transaction

bull La fin du block ne termine pas la transactionbull Pour terminer explicitement une transaction utiliser les commandes SQL

ndash COMMIT=gt valide les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

ndash ROLLBACK=gt annule toutes les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

bull Note Une transaction doit ecirctre un ensemble homogegravene de manipulations de la base de donneacutees =gt il faut reacuteflechir agrave tous les endroits ougrave il est leacutegitime de mettre un COMMIT

33

Controcircler les transactions dans PLSQL

DECLARE

noDept_v EmployenoDeptTYPE = 10

majorationSalaire_v EmployesalaireTYPE = 2000

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

COMMIT

UPDATE Employe

SET salaire = salaire + majorationSalaire_v

WHERE job = lsquoPROGRAMMEURrsquo

END

34

Affichage des donneacutees

Option

set serveroutput on cette option permet drsquoactiver lrsquoaffichage des donneacutees dans lrsquooutil sqlplus

Pour afficher un message ou une variable

DBMS_OUTPUTPUT_LINE(lsquomessagersquo)

35

Gestion des exceptionstraitement des erreurs

36

Gestion des exceptions

37

Gestion des exceptions Exemple

38

Gestion des curseurs

bull Neacutecessite lrsquoutilisation de curseurs

Les curseurs sont des zones de travail priveacutees ce sont des zones meacutemoire utiliseacutees pour analyser et interpreacuteter tout ordre SQL

bull Deux types de curseurs

bull les curseurs implicites

Le serveur Oracle utilise des curseurs implicites pour exeacutecuter les requecirctes SQL

bull les curseurs explicites

sont des variables explicitement deacuteclareacutees par le programmeur

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 32: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

32

Controcircler les transactions dans PLSQL

bull La premiegravere commande INSERTUPDATEDELETECREATEDROP drsquoun block entamme une nouvelle transaction

bull La fin du block ne termine pas la transactionbull Pour terminer explicitement une transaction utiliser les commandes SQL

ndash COMMIT=gt valide les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

ndash ROLLBACK=gt annule toutes les modifications faites depuis le deacutebut de la transaction en cours et entamme une nouvelle transaction

bull Note Une transaction doit ecirctre un ensemble homogegravene de manipulations de la base de donneacutees =gt il faut reacuteflechir agrave tous les endroits ougrave il est leacutegitime de mettre un COMMIT

33

Controcircler les transactions dans PLSQL

DECLARE

noDept_v EmployenoDeptTYPE = 10

majorationSalaire_v EmployesalaireTYPE = 2000

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

COMMIT

UPDATE Employe

SET salaire = salaire + majorationSalaire_v

WHERE job = lsquoPROGRAMMEURrsquo

END

34

Affichage des donneacutees

Option

set serveroutput on cette option permet drsquoactiver lrsquoaffichage des donneacutees dans lrsquooutil sqlplus

Pour afficher un message ou une variable

DBMS_OUTPUTPUT_LINE(lsquomessagersquo)

35

Gestion des exceptionstraitement des erreurs

36

Gestion des exceptions

37

Gestion des exceptions Exemple

38

Gestion des curseurs

bull Neacutecessite lrsquoutilisation de curseurs

Les curseurs sont des zones de travail priveacutees ce sont des zones meacutemoire utiliseacutees pour analyser et interpreacuteter tout ordre SQL

bull Deux types de curseurs

bull les curseurs implicites

Le serveur Oracle utilise des curseurs implicites pour exeacutecuter les requecirctes SQL

bull les curseurs explicites

sont des variables explicitement deacuteclareacutees par le programmeur

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 33: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

33

Controcircler les transactions dans PLSQL

DECLARE

noDept_v EmployenoDeptTYPE = 10

majorationSalaire_v EmployesalaireTYPE = 2000

BEGIN

DELETE FROM Employe

WHERE noDept = noDept_v

COMMIT

UPDATE Employe

SET salaire = salaire + majorationSalaire_v

WHERE job = lsquoPROGRAMMEURrsquo

END

34

Affichage des donneacutees

Option

set serveroutput on cette option permet drsquoactiver lrsquoaffichage des donneacutees dans lrsquooutil sqlplus

Pour afficher un message ou une variable

DBMS_OUTPUTPUT_LINE(lsquomessagersquo)

35

Gestion des exceptionstraitement des erreurs

36

Gestion des exceptions

37

Gestion des exceptions Exemple

38

Gestion des curseurs

bull Neacutecessite lrsquoutilisation de curseurs

Les curseurs sont des zones de travail priveacutees ce sont des zones meacutemoire utiliseacutees pour analyser et interpreacuteter tout ordre SQL

bull Deux types de curseurs

bull les curseurs implicites

Le serveur Oracle utilise des curseurs implicites pour exeacutecuter les requecirctes SQL

bull les curseurs explicites

sont des variables explicitement deacuteclareacutees par le programmeur

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 34: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

34

Affichage des donneacutees

Option

set serveroutput on cette option permet drsquoactiver lrsquoaffichage des donneacutees dans lrsquooutil sqlplus

Pour afficher un message ou une variable

DBMS_OUTPUTPUT_LINE(lsquomessagersquo)

35

Gestion des exceptionstraitement des erreurs

36

Gestion des exceptions

37

Gestion des exceptions Exemple

38

Gestion des curseurs

bull Neacutecessite lrsquoutilisation de curseurs

Les curseurs sont des zones de travail priveacutees ce sont des zones meacutemoire utiliseacutees pour analyser et interpreacuteter tout ordre SQL

bull Deux types de curseurs

bull les curseurs implicites

Le serveur Oracle utilise des curseurs implicites pour exeacutecuter les requecirctes SQL

bull les curseurs explicites

sont des variables explicitement deacuteclareacutees par le programmeur

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 35: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

35

Gestion des exceptionstraitement des erreurs

36

Gestion des exceptions

37

Gestion des exceptions Exemple

38

Gestion des curseurs

bull Neacutecessite lrsquoutilisation de curseurs

Les curseurs sont des zones de travail priveacutees ce sont des zones meacutemoire utiliseacutees pour analyser et interpreacuteter tout ordre SQL

bull Deux types de curseurs

bull les curseurs implicites

Le serveur Oracle utilise des curseurs implicites pour exeacutecuter les requecirctes SQL

bull les curseurs explicites

sont des variables explicitement deacuteclareacutees par le programmeur

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 36: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

36

Gestion des exceptions

37

Gestion des exceptions Exemple

38

Gestion des curseurs

bull Neacutecessite lrsquoutilisation de curseurs

Les curseurs sont des zones de travail priveacutees ce sont des zones meacutemoire utiliseacutees pour analyser et interpreacuteter tout ordre SQL

bull Deux types de curseurs

bull les curseurs implicites

Le serveur Oracle utilise des curseurs implicites pour exeacutecuter les requecirctes SQL

bull les curseurs explicites

sont des variables explicitement deacuteclareacutees par le programmeur

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 37: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

37

Gestion des exceptions Exemple

38

Gestion des curseurs

bull Neacutecessite lrsquoutilisation de curseurs

Les curseurs sont des zones de travail priveacutees ce sont des zones meacutemoire utiliseacutees pour analyser et interpreacuteter tout ordre SQL

bull Deux types de curseurs

bull les curseurs implicites

Le serveur Oracle utilise des curseurs implicites pour exeacutecuter les requecirctes SQL

bull les curseurs explicites

sont des variables explicitement deacuteclareacutees par le programmeur

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 38: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

38

Gestion des curseurs

bull Neacutecessite lrsquoutilisation de curseurs

Les curseurs sont des zones de travail priveacutees ce sont des zones meacutemoire utiliseacutees pour analyser et interpreacuteter tout ordre SQL

bull Deux types de curseurs

bull les curseurs implicites

Le serveur Oracle utilise des curseurs implicites pour exeacutecuter les requecirctes SQL

bull les curseurs explicites

sont des variables explicitement deacuteclareacutees par le programmeur

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 39: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

39

Gestion des curseurs

bull Attributs des curseurs en utilisant les attributs de curseurs vous pouvez tester le reacutesultat de vos requecirctes SQL

bull SQLROWCOUNT

nombre de tuples affecteacutes par la derniegravere requecircte SQL (entier)

bull SQLFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL a affecteacute plus drsquoun tuple

bull SQLNOTFOUND

booleacuteen vaut TRUE si la derniegravere requecircte SQL nrsquoa affecteacute aucun tuple

bull SQLISOPEN

booleacuteen indiquant si le curseur est ouvert ou fermeacute (par deacutefaut les curseurs

implicites sont toujours fermeacutes agrave la fin de la requecircte)

bull Note agrave la place de lsquoSQLrsquo utilisez le nom de votre curseur pour identifier lrsquoeacutetat drsquoun curseur explicite

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 40: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

40

Gestion des curseurs

bull Gestion explicites des curseurs bull Deacuteclaration dans la section DECLARE CURSOR nom_curseur IS ordre_select

bull Ouverture dans la section BEGIN END OPEN nom_curseur

bull Assignation des valeurs dune ligne aux variables reacuteceptrices ou agrave la structure (souvent dans une boucle)

FETCH nom_curseur INTO liste_variables structure

bull Fermeture et libeacuteration de la place meacutemoire CLOSE nom_curseur

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 41: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

41

Gestion des curseurs

DECLARE CURSOR departementVentes_v IS SELECT FROM Departement WHERE nomDept = lsquoVENTESrsquo unDepartement_v DepartementROWTYPE compteur_v number = 0 BEGINOPEN departementVentes_v LOOPFETCH departementVentes_v INTO unDepartement_v EXIT WHEN departementVentes_vNOTFOUND compteur_v = compteur_v +1 END LOOP CLOSE departementVentes_v END

42

Exercice

Page 42: 1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire

42

Exercice