65
PL-SQL-Support-TP Partie1:PL-SQL Support de TP

PLSQL

  • Upload
    ferouk

  • View
    378

  • Download
    1

Embed Size (px)

DESCRIPTION

PLSQL

Citation preview

Page 1: PLSQL

PL-SQL-Support-TP

Partie1:PL-SQL

Support de TP

Page 2: PLSQL

PL-SQL-Support-TP

I. Le langage PL/SQL

Introduction

Page 3: PLSQL

PL-SQL-Support-TP

1.1 Présentation

-Le langage PL/SQL (Procedural language/SQL) est une extension du langage SQL

qui offre un environnement procédural au langage SQL.

-Dans l’environnement PL/SQL, les ordres SQL et PL/SQL sont regroupés en blocs. Un

bloc ne demande qu’un seul transfert vers le moteur PL/SQL qui interprète en une seule

fois l’ensemble des commandes contenues dans le bloc.

Page 4: PLSQL

PL-SQL-Support-TP

1.2 Structure de Bloc

Un programme ou une procédure PL/SQL est constitué d’un ou de

plusieurs blocs.

Chaque bloc comporte 3 sections :

• La section déclaration, introduite par le mot clé DECLARE,

contient la description des structures et des variables utilisées

dans le bloc. Cette section est facultative ;

• La section corps du bloc, introduite par le mot clé BEGIN,

contient les instructions du programme ainsi que la section de

traitement des erreurs. La section corps du bloc est obligatoire et

se termine par le mot clé END ;

• La section traitement des erreurs, introduite par le mot clé

EXCEPTION, contient les instructions de gestion des erreurs.

Cette section est facultative.

Page 5: PLSQL

PL-SQL-Support-TP

1.2 Structure de Bloc

Page 6: PLSQL

PL-SQL-Support-TP

2.Gestion des données

• Pour réaliser des traitements, nous avons besoin d’utiliser des

variables.

• Ces variables servent notamment au stockage des données

obtenues depuis la base par exécution d’une requête SQL ou

utilisées comme paramètres dans les ordres de LMD.

• Toute variable utilisée dans un bloc doit être déclarée dans une

section DECLARE.

• Deux classes de types de données existent dans le langage

PL/SQL : composés et scalaire.

Page 7: PLSQL

PL-SQL-Support-TP

2.1 Types scalaires

Outre les types CHAR, VARCHAR2, NUMBER et DATE, disponibles dans le langage SQL, le langage PL/SQL offre les types supplémentaires suivants :

– BOOLEAN

– BINARY_INTEGER

– DECIMAL

– FLOAT

– INTEGER

– REAL.

Page 8: PLSQL

PL-SQL-Support-TP

2.1 Types scalaires

• La déclaration d’une variable se fait par association du nom de

la variable à un type sous la forme :

nom_variable type;

Exemple: v_nompilote varchar2(25);

• Il est aussi possible de déclarer une variable par référence à une

colonne d’une table, par la notation %type :

nom_variable nom_table.nom_colonne%type;

Exemple: v_nompilote pilote.nom%type;

Page 9: PLSQL

PL-SQL-Support-TP

2.2 Types composés

PL/SQL offre deux types composés :

*enregistrement (RECORD)

*et table (TABLE).

Page 10: PLSQL

PL-SQL-Support-TP

2.2 Types composés

(1) Enregistrement

Déclaration : La déclaration de variable de ce type se fait:

· Soit par référence à une structure de table, en utilisant la notion

%ROWTYPE.

Nom_varibale nom_table%rowtype;

Exemple:info_pilote pilote%rowtype;

Page 11: PLSQL

PL-SQL-Support-TP

Soit par énumération des rubriques qui la composent. Dans ce cas, ladéclaration se fait en 2 étapes :

1-Déclaration du type enregistrement :

TYPE nom_type IS RECORD (nom_champ type_champ…) ;

Exemple: TYPE t_pilote IS RECORD(nom_pilote pilote.nom%type; revenu_pilote number(8,2)) ;

2- Déclaration de la variable de type enregistrement :

nom_variable nom_type ;

Exemple : TYPE t_pilote IS RECORD (nom_pilote pilote.nom%type ; revenu_pilote number(8,2)) ;

Employe t_pilote ;

2.2 Types composés

(1) Enregistrement

Page 12: PLSQL

PL-SQL-Support-TP

2.2 Types composés

(2) Table

– Le type table représente une structure composée d’éléments d’un

même type scalaire.

– L’accès à un élément de la table s’effectue grâce à un indice, ou clé

primaire déclarée de type BINARY_INTEGER.

– La déclaration de variable de ce type se fait en 2 étapes :

1-Déclaration du type de l’élément de la table

2-Déclaration de la variable de type table

Page 13: PLSQL

PL-SQL-Support-TP

1-Déclaration du type de l’élément de la table :

TYPE nom_type IS TABLE OF type_champ INDEX BYBINARY_INTEGER;

2-Déclaration de la variable de type table :

nom_variable nom_type ;

Exemple :

TYPE t_nom IS TABLE OF CHAR(35) INDEX BY BINARY_INTEGER ;

Table_nom t_nom ;

2.2 Types composés

(2) Table

Page 14: PLSQL

PL-SQL-Support-TP

2.3 Initialisation des variables

Il est possible:

• d’attribuer une valeur initiale à une variable au moment de sadéclaration :

nom_variable type := valeur ;

Exemple: salaire pilote.sal%type :=250.00;

• de définir une valeur constante par :

nom_variable type DEFALUT valeur ;

Expl: v_comm pilote.comm%type DEFAULT 0;

ou bien

nom_variable CONSTANT type := valeur ;

Expl: v_comm CONSTANT pilote.comm%type := 0.25;

Page 15: PLSQL

PL-SQL-Support-TP

3. Affectation d‟une valeur à une

variable

• Trois moyens existent pour affecter une valeur à

une variable :

– L’opérateur d’affectation

– Valeur résultat d’une requête

– L’ordre FETCH (Voir Cours prochain)

Page 16: PLSQL

PL-SQL-Support-TP

3.1 L‟opérateur d‟affectation

• Pour les types simples l’affectation est faite de la façon suivante

nom_variable := valeur ;

• Pour les types composés l’affectation diffère selon le type de cettevariable record ou table.

*Record : nom_variable.nom_champ

Exemple: employe.nom_pilote:=’tarkani’;

employe.revenu_pilote :=3000 ;

*Table : nom_variable(valeur clé primaire)

Exemple : Table_nom(3) :=’tarkani’ ;

Page 17: PLSQL

PL-SQL-Support-TP

3.2 Valeur résultat d’une requête

• L’utilisation de la clause INTO de l’ordre SELECT permetd’affecter à une variable le résultat d’une requête.

• Il est à noter que cet ordre SELECT n’est utilisable que si l’onest sûr qu’il retourne un seul tuple ; sinon il faut utiliser lescurseurs (Voir cours prochain).

• Syntaxe : SELECT liste d’expressions

INTO liste de variables

FROM….

Exemple :

Page 18: PLSQL

PL-SQL-Support-TP

4. Instructions de contrôle

• Comme tout langage de programmation, le

PL/SQL offre des structures de contrôle:

– Alternatives

– Répétitives.

Page 19: PLSQL

PL-SQL-Support-TP

4.1. Structure alternative

• Cette structure permet l’exécution d’une séquenced’instructions sous le contrôle d’une condition. 3 formesexistent :

Page 20: PLSQL

PL-SQL-Support-TP

4.2 Structures répétitives

• LOOP répète indéfiniment une séquence d’instructions

• FOR contrôle le nombre d’exécutions des instructions de la structure répétitive par

incrémentation et test d’une variable indice. Le pas ne peut être égal qu’à 1.

FOR variable_indice IN [REVERSE] valeur_debut .. valeur_fin

LOOP

Instructions;

END LOOP;

•WHILE répète les instructions de la structure répétitive tant que la condition

a la valeur VRAI.WHILE condition

LOOP

Instructions;

END LOOP;

Page 21: PLSQL

PL-SQL-Support-TP

Remarques• Pour afficher un commentaire:

DBMS_OUTPUT.PUT_LINE(‘texte_mess’);

• Pour afficher le contenu d’une variable on utilise:

DBMS_OUTPUT.PUT_LINE(nom_var);

• L’affichage d’un commentaire suivi de l’affichage du contenu d’une variable:

DBMS_OUTPUT.PUT_LINE(‘texte_mess’ || nom_var);

• L’affichage ne sera visualisé que lorsque l’ordre SQL suivant est exécuté dans l’environnement SQL+:

SQL> SET SERVEROUTPUT ON;

Page 22: PLSQL

PL-SQL-Support-TP

II. Le langage PL/SQL

Les curseurs

Page 23: PLSQL

PL-SQL-Support-TP

1. Présentation

-Dans le cas ou l’ordre SELECT renvoie plusieurs lignes, on est amené àdéfinir des curseurs.

-Exemple: Écrire un bloc PL-SQL permettant d‟afficher les nomsdes pilotes dont les salaires sont > à 1200DT.

Select nom

Into v_nom

Where sal>1200;

-L’utilisation d’un curseur pour traiter un ordre SELECT renvoyantplusieurs lignes nécessite les 4 étapes suivantes :

1. Déclaration du curseur

2. Ouverture du curseur

3. Traitement des lignes

4. Fermeture

Cette solution n‟est plus valable

parce qu‟on peut pas affecter

plusieurs Vals à une seule variable.

Page 24: PLSQL

PL-SQL-Support-TP

2. Déclaration d‟un curseur

Cette étape permet de définir la requête SELECT et de l’associer à un

curseur

Syntaxe :

CURSOR nom_curseur IS requête ;

Exemple :

CURSOR C1 IS SELECT nom FROM pilote WHERE sal<1230 ;

Page 25: PLSQL

PL-SQL-Support-TP

2. Déclaration d‟un curseur

• Le curseur peut être aussi défini à l’aide de paramètres. Ces paramètres peuvent être utilisé

• dans une condition de sélection, dans une expression et comme critère de la clause ORDER BY

Syntaxe :

CURSOR nom_curseur (nom_paramètre type [ :=valeur par défaut] [,…]) IS requête ;

Exemple :

DECLARE

CURSOR C2(psal NUMBER(8,2), pcom NUMBER(8,2))

IS SELECT nom

FROM pilote

WHERE sal<psal AND comm> pcomm ;

Page 26: PLSQL

PL-SQL-Support-TP

3. Ouverture et fermeture d‟un curseur

• L’ordre OPEN permet d’allouerun espace mémoire au curseur :

Syntaxe :

OPEN nom_curseur ;

OPEN nom_curseur (paramètres effectifs);

Exemple :

OPEN C1;

OPEN C2(1200,2500);

OPEN C2(pcomm=>2500, psal=>1200);

L’ordre CLOSE libère la

place mémoire.

Syntaxe :

CLOSE nom_curseur ;

Exemple:

CLOSE C1;

Page 27: PLSQL

PL-SQL-Support-TP

4. Traitement des lignes

• Les lignes obtenues par l’exécution de la requête SQL sontdistribuées une à une, par l’exécution d’un ordre FETCH inclusdans une structure répétitive.

• Pour chaque ligne, cette instruction transfère les valeurs desattributs projetés par l’ordre SELECT dans les variables PL/SQL.

Syntaxe :

FETCH nom_curseur INTO liste des variables;

Ou bien

FETCH nom_curseur INTO nom_enregistrement;

Page 28: PLSQL

PL-SQL-Support-TP

5.Exemple:

DECLARE

CURSOR C3 IS SELECT nom, sal FROM pilote where sal>22000;

V_nom pilote.nom%type;

V_sal pilote.sal%type;

BEGIN

OPEN C3;

LOOP

FETCH C3 INTO v_nom, v_sal;

EXIT WHEN C3%NOTFOUND;

DBMS_OUTPUT.PUT_LINE('Nom: ' || v_nom ||' Salaire: ' || v_sal);

END LOOP;

CLOSE C3;

END;

Écrire un bloc PLSQL permettant d’afficher les noms et les salaires

de tous les pilotes, dont les salaire dépassent 22000.

Methode1: Utilisation d‟un type scalaire

Page 29: PLSQL

PL-SQL-Support-TP

DECLARE

TYPE t_pil IS RECORD

(v_nom pilote.nom%type,

v_sal pilote.sal%type);

r_pil t_pil;

CURSOR C3 IS SELECT nom,sal FROM pilote where sal>22000;

BEGIN

OPEN C3;

LOOP

FETCH C3 INTO r_pil;

EXIT WHEN C3%NOTFOUND;

DBMS_OUTPUT.PUT_LINE('Nom: ' || r_pil.v_nom ||' Salaire: ' ||r_pil.v_sal);

END LOOP;

CLOSE C3;

END;

5.Exemple:Methode2: Utilisation d‟un type composé enregistrement

Page 30: PLSQL

PL-SQL-Support-TP

DECLARE

CURSOR C3 IS SELECT nom, sal FROM pilote wheresal>22000;

r_pil C3%ROWTYPE;

BEGIN

OPEN C3;

LOOP

FETCH C3 INTO r_pil;

EXIT WHEN C3%NOTFOUND;

DBMS_OUTPUT.PUT_LINE('Nom: ' || r_pil.nom ||' Salaire:' || r_pil.sal);

END LOOP;

CLOSE C3;

END;

5.ExempleMethode3: Utilisation d‟un type composé faisant réf à une structure d‟une table

Page 31: PLSQL

PL-SQL-Support-TP

6. Forme syntaxique condensée

• Il existe une autre façon qui permet d’ouvrir un curseur,traiter les lignes renvoyées par ce curseur, ainsi que lefermer.

• Cette façon s’appelle la forme condensée et utilise lastructure FOR.

• Cependant, la déclaration se fait de la même façon queprécédemment.

Page 32: PLSQL

PL-SQL-Support-TP

6. Forme syntaxique condenséeExemple:

DECLARE

CURSOR C3 IS SELECT nom, sal FROM pilote where sal>22000;

V_nom pilote.nom%type;

V_sal pilote.sal%type;

BEGIN

FOR i IN C3

LOOP

FETCH C3 INTO V_nom,V_sal;

DBMS_OUTPUT.PUT_LINE('Nom: ' || v_nom ||' Salaire: ' || v_sal);

END LOOP;

END;

Page 33: PLSQL

PL-SQL-Support-TP

7. Statut d‟un curseur

Page 34: PLSQL

PL-SQL-Support-TP

III. Le langage PL/SQL

La Gestion Des Erreurs

Page 35: PLSQL

PL-SQL-Support-TP

1. Présentation• Une exception est une erreur qui survient durant une exécution.

• 2 types d’exceptions:

– Prédéfinies par ORACLE

– Définie par le programmeur

Syntaxe:

Page 36: PLSQL

PL-SQL-Support-TP

1.1 Prédéfinies par ORACLE

Exemple d’exception prédéfinies par ORACLE:

Page 37: PLSQL

PL-SQL-Support-TP

1.1 Prédéfinies par ORACLE

• Exemple:

Page 38: PLSQL

PL-SQL-Support-TP

1.2 Définies par l’utilisateur

Exemple:

Page 39: PLSQL

PL-SQL-Support-TP

IV. Le langage PL/SQLFonction-Procédure

Page 40: PLSQL

PL-SQL-Support-TP

1. Présentation

• L’utilisation des procédures ou de fonctionsstockées permet d’enregistrer et d’exécuter destraitements fréquemment utilisés au niveau dunoyau du SGBDR plutôt que dans chaqueapplication.

• Un seul exemplaire du traitement est donc définiet stocké dans la base et il est exécutable, en modepartagé, par toutes les applications qui y fontréférence.

Page 41: PLSQL

PL-SQL-Support-TP

2. Développement d‟une procédure

stockéeDéclaration d’une procédure-Syntaxe:

-Le mode définit si le paramètre est en entrée (IN), en sortie (OUT)

ou en entré

sortie (IN OUT).

-Le mode par défaut est IN.

-Le Bloc est le corps de la procédure.

Page 42: PLSQL

PL-SQL-Support-TP

2. Développement d‟une procédure

stockée-Exemple*Créer une procédure stockée permettant d’insérer l’enregistrement

suivant à la table pilote: (‘1331’, ‘Tunis’)

CREATE OR REPLACE PROCEDURE nv_pilote

(x_nopilot IN pilote.nopilot%type,

x_adresse IN pilote.adresse%type)

IS

Begin

INSERT INTO pilote(nopilot, adresse)

VALUES(x_nopilot, x_adresse);

COMMIT WORK;

END nv_pilote;

/

Page 43: PLSQL

PL-SQL-Support-TP

Appel d‟une procédure stockée à

partir de l‟environnement SQL*PLUS

• SQL> EXECUTE nom_procédure[(liste des

paramètres effectifs)] ;

• Exemple:

• SQL> EXECUTE nv_pilote(‘1331’, ‘Tunis’) ;

Page 44: PLSQL

PL-SQL-Support-TP

• RETURN type_retour définit le type de la valeur

retournée par la fonction.

• Bloc est le corps de la fonction. Il doit contenir une

instruction RETURN(variable_résultat).

3. Développement d‟une fonction

stockéeDéclaration d’une Fonction-Syntaxe:

Page 45: PLSQL

PL-SQL-Support-TP

3. Développement d‟une fonction

stockée-ExempleCréer une fonction stockée permettant de calculer et de retourner la

moyenne des nombres des heures de vols par code type

CREATE OR REPLACE FUNCTION

moy_h_vol(x_codetype IN appareil.codetype%type)

RETURN NUMBER

IS

Nbhvol_avg NUMBER(8,2):=0;

BEGIN

SELECT AVG(nbhvol)

INTO Nbhvol_avg

FROM avion

WHERE type = x_codetype;

RETURN(Nbhvol_avg);

END moy_h_vol;

Page 46: PLSQL

PL-SQL-Support-TP

Appel d‟une fonction stockée à

partir de l‟environnement

SQL*PLUS

• SQL> EXECUTE :variable_locale:=nom_fonction[(liste

des paramètres effectifs)] ;

• Pour déclarer une variable locale, il suffit d’utiliser la

commande VARIABLE

• SQL> VARIABLE moyenne NUMBER

• SQL> EXECUTE :moyenne:=moy_h_vol(‘AB3’);

• SQL> PRINT moyenne

Page 47: PLSQL

PL-SQL-Support-TP

Compilation

• Pour compiler la fonction ou la procédure stockée, il suffitd’exécuter le fichier contenant ces dernières. En cas de détectiond’une erreur de syntaxe pendant la phase de compilation, lemessage d’erreur suivant est affiché :

“ Procedure created with compilation errors”

• Pour connaître le diagnostic des erreurs, il suffit d’utiliser les vuessuivantes du dictionnaire de données:

-USER_ERRORS

-ALL_ERRORS

-DBA_ERRORS.

Page 48: PLSQL

PL-SQL-Support-TP

Compilation

• Des informations générales sur la procédure ou sur lafonction sont stockées dans les vues suivantes dudictionnaire de données :

– USER_OBJECTS

– ALL_ OBJECTS

– DBA_ OBJECTS.

• Le texte source des procédures et des fonctions stockées setrouve dans les vues suivantes du dictionnaire de données :

– USER_SOURCE

– ALL_ SOURCE

– DBA_ SOURCE.

Page 49: PLSQL

PL-SQL-Support-TP

Suppression d‟une procédure

ou d‟une fonction :

Syntaxe:

Page 50: PLSQL

PL-SQL-Support-TP

Utilisation d‟une procédure ou

d‟une fonction stockée

• Le mode d’appel est différent selon l’environnement àpartir duquel la procédure ou la fonction est employée.

Page 51: PLSQL

PL-SQL-Support-TP

V. Le langage PL/SQLPackage

Page 52: PLSQL

PL-SQL-Support-TP

Structure d‟un package

• Un package est similaire à la notion de classe dansl’orienté objet.

• Il regroupe des procédures, des fonctions, des variables,des constantes, des curseurs et des traitements d’exceptionsqui ont un lien logique entre eux, sous une seule entité.

• Les procédures et les fonctions peuvent être:

– Publiques: PUBLIC: c’est à dire appelées depuis l’extérieur dupackage.

– Privées: PRIVATE: qui sont invisibles à l’extérieur etaccessibles uniquement à des procédures du même package.

Page 53: PLSQL

PL-SQL-Support-TP

Création d’un package

• La création d’un package est différente de

celle des procédures et des fonctions. En

effet, elle s’étale sur 2 étapes :

– Création de la partie spécification

– Création de la partie BODY

Page 54: PLSQL

PL-SQL-Support-TP

Création de la partie

spécification

• la création et la compilation s’effectuent par lacommande suivante :

Page 55: PLSQL

PL-SQL-Support-TP

Création de la partie BODY• la création et la compilation s’effectuent par la

commande suivante:

• Il est à noter que dans le corps du package, l’ordre de déclaration doit être tel que les éléments référencés par un autre élément doivent être déclarés avant lui.

Page 56: PLSQL

PL-SQL-Support-TP

Exemple-Partie Spécification

CREATE OR REPLACE PACKAGE package_Série3 AS

PROCEDURE supprimer_pilote(v_pilote pilote.nopilot%type);

PROCEDURE comm_pilote(v_pilot pilote.nopilot%type,

txcomm float);

FUNCTION max_h_v_type (v_type appareil.codetype%type)

RETURN NUMBER;

FUNCTION pilote_avion_piloté (v_nopilot pilote.nopilot%type)

RETURN NUMBER;

END package_Série3;

/

Page 57: PLSQL

PL-SQL-Support-TP

Exemple:Partie BodyCREATE OR REPLACE PACKAGE BODY pilote_work AS

PROCEDURE nv_pilote

(x_nopilot IN pilote.nopilot%type, x_adresse IN pilote.adresse%type)IS

Begin

INSERT INTO pilote(nopilot, adresse)

VALUES(x_nopilot, x_adresse);

COMMIT WORK;

END nv_pilote;

FUNCTION moy_h_vol(x_codetype IN appareil.codetype%type)RETURN NUMBER IS

Nbhvol_avg NUMBER(8,2):=0;

BEGIN

SELECT AVG(nbhvol)

INTO Nbhvol_avg

FROM avion

WHERE type = x_codetype;

RETURN(Nbhvol_avg);

END moy_h_vol;

END pilote_work;

Page 58: PLSQL

PL-SQL-Support-TP

VI. Le langage PL/SQLTriggers

Page 59: PLSQL

PL-SQL-Support-TP

Présentation

• On appelle déclencheur ou trigger: un traitement déclenché par unévénement.

• Les triggers peuvent être applicatifs ou de base de données.

• Nous ne nous intéresserons qu’aux déclencheurs de BD puisqu’ilspermettent d’implémenter des règles de gestion complexes etcomplètent les règles d’intégrité référentielle associées à ladéclaration des tables.

• Par exemple, un déclencheur peut être défini pour vérifier, lors dechaque affectation d’un avion à un vol, que l’avion n’est pas déjàrequis pour une autre affectation pendant la durée de vol.

Page 60: PLSQL

PL-SQL-Support-TP

Présentation• Les triggers de BD sont associés à une et une seule table, il

est opérationnel jusqu’à la suppression de la table à laquelle ilest lié.

• Le traitement associé au trigger peut être exécuté:

– Soit une fois: suite à l’événement qui l’a déclenché(trigger par ordre)

– Soit pour chaque ligne de la table concernée parl’événement (trigger ligne).

• Mais comment peut-on déclencher un trigger BD ?

L’événement déclencheur est une action de mise à jour surla table

(INSERT, DELETE, UPDATE).

Page 61: PLSQL

PL-SQL-Support-TP

Syntaxe de trigger par ordre

Dans le cas de l’option UPDATING, il est possible de préciser le nom de la colonne

sur laquelle porte la modification par la syntaxe:

IF UPDATING („nom_colonne‟) THEN traitements END IF;

Page 62: PLSQL

PL-SQL-Support-TP

Syntaxe de trigger par ordreExemple

Page 63: PLSQL

PL-SQL-Support-TP

Syntaxe de trigger ligne

• Un déclencheur ligne est exécuté pour chacune des lignesconcernées par l’exécution de l’événement.

Page 64: PLSQL

PL-SQL-Support-TP

Syntaxe de trigger ligne

Exemple

VALUES

Page 65: PLSQL

PL-SQL-Support-TP

Trigger ligne

Suite

• Un trigger ligne avec l’option BEFORE peut servir àeffectuer des traitements d’initialisation avant exécutiondes modifications sur la table.

• Un trigger ligne avec l’option AFTER permet de propagerles modifications ou de gérer des historiques. Il est souventutilisé avec référence aux anciennes valeurs et/ou auxnouvelles valeurs des colonnes.

• Des informations générales sur les triggers sont stockéesdans les vues suivantes du dictionnaire de données :

– USER_TRIGGERS

– ALL_ TRIGGERS

– DBA_ TRIGGERS.