Plan
1. Introduction à PL/SQL
2. Les structures de contrôle
3. Interaction avec Oracle et curseurs explicites
4. Gestion des exceptions
5. Les sous programmes
6. Les sous programmes stockés et les packages
7. Les déclencheurs
• Les structures de contrôle
• Interaction avec Oracle et curseurs explicites
• Gestion des exceptions
• Les sous programmes
• Les sous programmes stockés et les
packages
• Les déclencheurs
• PL/SQL?
Introduction
Extension procédurale à SQL
• Avantages de PL/SQL
– Développement de programmes modulaires
• Déclaration des identifiants : Variables, Constantes,..
• Structures de contrôle
• Fonctions intégrées
• Blocs nommés : sous programmes
• Procédures et fonctions stockées
• Blocs imbriqués
• Package
– Déclencheurs de BD
– Portabilité
– Accroissement des performances
• PL/SQL distingue deux types de blocs : anonymes ou nommés
– Bloc anonyme correspond à une séquence d’instructions qui s’exécute
à l’endroit où elle existe
– Bloc nommé est un sous programme : fonction ou procédure
éventuellement paramétrée et pouvant être appelée autant de fois
que nécessaire
• Exemple
DECLARE – ceci est un bloc anonyme
V_Sal NUMBER (9,3); --déclaration
V_Mess VARCHAR2 (50);
BEGIN
SELECT Sal
INTO V_Sal
FROM Chercheur WHERE Chno =1234;
EXCEPTION
WHEN NO_DATA_FOUND THEN
--gestion de l’exception NO_DATA_FOUND
V_Mess := ‘Chercheur non trouvé’;
--suite
END;
• Types PL/SQL
PL/SQL supporte une variété de type de données utiles pour
déclarer des variables et des constantes – compatibles avec les
types Oracle (colonnes de tables)+type BOOLEAN
Type Scalaire
NUMBER[(précision, scale)]
VARCHAR2
CHAR
DATE
BOOLEAN...
• Déclarations de variables
Identificateur Type [(précision, scale)] [NOT NULL] [:=expression];
Où
Identificateur : règles Oracles habituelles
NOT NULL : initialisation obligatoire
Exemples
DECLARE
….
V_sal NUMBER (7,3);
V_message VARCHAR2(80):= ‘Texte initial’;
Married BOOLEAN:=FALSE;
Next_Week DATE :=DATE+7;
• Suivre les conventions suivantes :
Identifiant
Variable
Exception
Curseur
Paramètre
Préfix Exemple
V_ V_sal
E_ E_RupStock
C_ C_EMPDEPT10
P_ P_EMPNO
• L’attribut %Type
Déclaration de variable en se référant au type d’une variable ou d’une colonne
Identificateur nomTable.colonne%Type;
Avantage
Garantit la compatibilité de type surtout si la variable déclaré sera cité dans INTO pour initialisation à partir d’une colonne
Exemple
DECLARE
…
V_deptno1 dept.deptno%TYPE;
V_loc
dept.loc%TYPE;
V_deptno2 deptno%TYPE;
BEGIN
SELECT deptno, loc
INTO v_deptno1, v_loc
FROM …
WHERE …
• Déclaration de constantes
Identificateur CONSTANT Type [(precision,scale)]:=expression;
Exemple
Pie CONSTANT NUMBER(9,5):=3.14159;
Affectations et expressions
Identificateur := expression;
Exemple
V_compteur :=V_compteur+1;
V_message := TO_CHAR(v_compteur);
V_ename :=‘KING’;
Conversion implicite
Outre les conversions explicites par les fonctions prédéfinies (TO_CHAR, TO_NUMEBR, TO_DATE,…), PL/SQL peut effectuer
des conversions implicites c’est-à-dire automatiquement lors des affectations/évaluations d’expressions
1. Affectation d’un nombre dans une chaîne
V_message VARCHAR2 := 1500;
2. Affectation d’un nombre représenté sous forme de chaîne dans une variable numérique une variable numérique :
V_message VARCHAR2 := 15OO;
V_sal NUMBER(9,3):=v_message;
Attention : Ne pas affecter une valeur textuelle dans une variable numérique
• Blocs Imbriqués et Portée d’une variable
<<bloc1>>
DECLARE
Birthdate
BEGIN
……
DECLARE
Birthdate
BEGIN
…
DATE ;
DATE;
END ;
END bloc1;
Instruction Conditionnelle : IF
• Syntaxe :
IF condition1 THEN
séquence;
[ELSIF condition2 THEN
séquence; ]
[ELSIF condition3 THEN
séquence; ]
[ELSE
séquence; ]
END IF;
ELSE et ELSIF : optionnelles
Structure Case
WHEN expr1 THEN instructions1;
WHEN expr2 THEN instructions2;
…
WHEN exprN THEN instructionsN;
[ELSE instructionsN+1;]
END CASE [étiquette];
[<<étiquette>>]
CASE variable
Exemples
IF choix = 1 Then
UPDATE
ELSE
UPDATE
END IF ;
EMP SET sal = sal + 100;
EMP SET sal = sal * 1.1;
• La boucle de base : LOOP
[<<étiquette>>]
LOOP
Séquence;
Infinie !!!
END LOOP [<<étiquette>>];
On peut quitter une boucle avec la commande EXIT.
EXIT [étiquette] [ WHEN condition] ;
Exemple :
Compteur := 0;
LOOP
Compteur := Compteur + 1;
Insert into LIGNE values (Compteur) ;
…
EXIT WHEN Compteur =10;
…
END LOOP;
Syntaxe :
WHILE condition
LOOP
Séquence;
END LOOP;
La boucle WHILE
LOOP et END LOOP jouent le rôle de FAIRE et FIN FAIRE dans une boucle
algorithmique TANT QUE.
Exemple :
Compteur := 1;
WHILE compteur <=5
LOOP
...
Insert into DEPT (deptno,Loc)
Values (dept_seq.NEXTVAL,’Sfax’) ;
Compteur := Compteur + 1;
…
END LOOP;
Syntaxe :
La boucle FOR
FOR indice IN [REVERSE] b_inf..b_sup
LOOP
Séquence;
END LOOP;
Où
Indice :
variable entière déclarée implicitement par la boucle
locale
Référencé dans la boucle seulement
l’affecter à une variable si nécessaire
S’incrémente automatiquement de 1 à la fin de chaque itération
1. Introduction à PL/SQL
2. Les structures de contrôle
3. Interaction avec Oracle et curseurs explicites
4. Gestion des exceptions
5. Les sous programmes
6. Les sous programmes stockés et les packages
7. Les déclencheurs
Introduction à PL/SQL
• Les structures de contrôle
• Interaction avec Oracle et curseurs explicites
• Gestion des exceptions
• Les sous programmes
• Les sous programmes stockés et les
packages
• Les déclencheurs
• PL/SQL?
Introduction
Extension procédurale à SQL
• Avantages de PL/SQL
– Développement de programmes modulaires
• Déclaration des identifiants : Variables, Constantes,..
• Structures de contrôle
• Fonctions intégrées
• Blocs nommés : sous programmes
• Procédures et fonctions stockées
• Blocs imbriqués
• Package
– Déclencheurs de BD
– Portabilité
– Accroissement des performances
• PL/SQL distingue deux types de blocs : anonymes ou nommés
– Bloc anonyme correspond à une séquence d’instructions qui s’exécute
à l’endroit où elle existe
– Bloc nommé est un sous programme : fonction ou procédure
éventuellement paramétrée et pouvant être appelée autant de fois
que nécessaire
• Exemple
DECLARE – ceci est un bloc anonyme
V_Sal NUMBER (9,3); --déclaration
V_Mess VARCHAR2 (50);
BEGIN
SELECT Sal
INTO V_Sal
FROM Chercheur WHERE Chno =1234;
EXCEPTION
WHEN NO_DATA_FOUND THEN
--gestion de l’exception NO_DATA_FOUND
V_Mess := ‘Chercheur non trouvé’;
--suite
END;
• Types PL/SQL
PL/SQL supporte une variété de type de données utiles pour
déclarer des variables et des constantes – compatibles avec les
types Oracle (colonnes de tables)+type BOOLEAN
Type Scalaire
NUMBER[(précision, scale)]
VARCHAR2
CHAR
DATE
BOOLEAN...
• Déclarations de variables
Identificateur Type [(précision, scale)] [NOT NULL] [:=expression];
Où
Identificateur : règles Oracles habituelles
NOT NULL : initialisation obligatoire
Exemples
DECLARE
….
V_sal NUMBER (7,3);
V_message VARCHAR2(80):= ‘Texte initial’;
Married BOOLEAN:=FALSE;
Next_Week DATE :=DATE+7;
• Suivre les conventions suivantes :
Identifiant
Variable
Exception
Curseur
Paramètre
Préfix Exemple
V_ V_sal
E_ E_RupStock
C_ C_EMPDEPT10
P_ P_EMPNO
• L’attribut %Type
Déclaration de variable en se référant au type d’une variable ou d’une colonne
Identificateur nomTable.colonne%Type;
Avantage
Garantit la compatibilité de type surtout si la variable déclaré sera cité dans INTO pour initialisation à partir d’une colonne
Exemple
DECLARE
…
V_deptno1 dept.deptno%TYPE;
V_loc
dept.loc%TYPE;
V_deptno2 deptno%TYPE;
BEGIN
SELECT deptno, loc
INTO v_deptno1, v_loc
FROM …
WHERE …
• Déclaration de constantes
Identificateur CONSTANT Type [(precision,scale)]:=expression;
Exemple
Pie CONSTANT NUMBER(9,5):=3.14159;
Affectations et expressions
Identificateur := expression;
Exemple
V_compteur :=V_compteur+1;
V_message := TO_CHAR(v_compteur);
V_ename :=‘KING’;
Conversion implicite
Outre les conversions explicites par les fonctions prédéfinies (TO_CHAR, TO_NUMEBR, TO_DATE,…), PL/SQL peut effectuer
des conversions implicites c’est-à-dire automatiquement lors des affectations/évaluations d’expressions
1. Affectation d’un nombre dans une chaîne
V_message VARCHAR2 := 1500;
2. Affectation d’un nombre représenté sous forme de chaîne dans une variable numérique une variable numérique :
V_message VARCHAR2 := 15OO;
V_sal NUMBER(9,3):=v_message;
Attention : Ne pas affecter une valeur textuelle dans une variable numérique
• Blocs Imbriqués et Portée d’une variable
<<bloc1>>
DECLARE
Birthdate
BEGIN
……
DECLARE
Birthdate
BEGIN
…
DATE ;
DATE;
END ;
END bloc1;
Instruction Conditionnelle : IF
• Syntaxe :
IF condition1 THEN
séquence;
[ELSIF condition2 THEN
séquence; ]
[ELSIF condition3 THEN
séquence; ]
[ELSE
séquence; ]
END IF;
ELSE et ELSIF : optionnelles
Structure Case
WHEN expr1 THEN instructions1;
WHEN expr2 THEN instructions2;
…
WHEN exprN THEN instructionsN;
[ELSE instructionsN+1;]
END CASE [étiquette];
[<<étiquette>>]
CASE variable
Exemples
IF choix = 1 Then
UPDATE
ELSE
UPDATE
END IF ;
EMP SET sal = sal + 100;
EMP SET sal = sal * 1.1;
• La boucle de base : LOOP
[<<étiquette>>]
LOOP
Séquence;
Infinie !!!
END LOOP [<<étiquette>>];
On peut quitter une boucle avec la commande EXIT.
EXIT [étiquette] [ WHEN condition] ;
Exemple :
Compteur := 0;
LOOP
Compteur := Compteur + 1;
Insert into LIGNE values (Compteur) ;
…
EXIT WHEN Compteur =10;
…
END LOOP;
Syntaxe :
WHILE condition
LOOP
Séquence;
END LOOP;
La boucle WHILE
LOOP et END LOOP jouent le rôle de FAIRE et FIN FAIRE dans une boucle
algorithmique TANT QUE.
Exemple :
Compteur := 1;
WHILE compteur <=5
LOOP
...
Insert into DEPT (deptno,Loc)
Values (dept_seq.NEXTVAL,’Sfax’) ;
Compteur := Compteur + 1;
…
END LOOP;
Syntaxe :
La boucle FOR
FOR indice IN [REVERSE] b_inf..b_sup
LOOP
Séquence;
END LOOP;
Où
Indice :
variable entière déclarée implicitement par la boucle
locale
Référencé dans la boucle seulement
l’affecter à une variable si nécessaire
S’incrémente automatiquement de 1 à la fin de chaque itération