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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
42
Exercice
Top Related