Oracle: Procédures, Fonctions, Packages, Triggers
Oracle: Procédures, Fonctions, Packages, Triggers
Une procédure est un programme écrit avec le langage PL/SQL, pour réaliser
une ou plusieurs tâches élémentaires. Un seul exemplaire de la procédure est
stocké dans la base, et il est partageable par une multitude de programmes
d’applications
Syntaxes :
Mode:
• IN (valeur par défaut) qui permet de passer une valeur à la
procédure ou fonction.
• OUT, qui permet à la procédure de retourner une valeur à
l’environnement.
Professeur : ASSALE Adjé Louis 1/14 INP-HB Professeur : ASSALE Adjé Louis 2/14 INP-HB
ORACLE Option procédurale ORACLE Option procédurale
• IN OUT le même paramètre sert à passer une valeur à la procédure 2.3 Appel de sous-programme
puis à obtenir une valeur de la procédure.
EXEMPLES : Syntaxe d’appel dans SQL*PLUS :
Exemple:
CREATE FUNCTION lecture_prix
(N_livre IN NUMBER(5,2))
RETURN number (5,2)
IS
Variable curseur
Let_prix number(5,2); Constante exception
BEGIN
SELECT prix
INTO lect_prix
FROM Livre Différents éléments peuvent constituer un package
WHERE N_liv # = N_livre; - Procédure - Fonction - Variable
RETURN (let_prix); - Curseur - Constante - Exception
END; Un package est construit en deux parties :
- une partie spécification et une partie BODY
Professeur : ASSALE Adjé Louis 3/14 INP-HB Professeur : ASSALE Adjé Louis 4/14 INP-HB
ORACLE Option procédurale ORACLE Option procédurale
Déclaration de Procédure
la procédure A
publique 3.2 Partie Body
Définition de la Procédure
procédure A
publique 3.3 Exemples:
Syntaxes : - Appel des éléments d’un package, on préfixe le nom de l’objet appelé dans le
package du nom du package par exemple nom_package.nom_procedure.
Professeur : ASSALE Adjé Louis 5/14 INP-HB Professeur : ASSALE Adjé Louis 6/14 INP-HB
ORACLE Option procédurale ORACLE Option procédurale
- UPDATE
Package Pk Package
Spécification
- DELETE
Procédure A Procédure X • Des restrictions éventuelles
Variable C …. - WHEN
…. • Les ordres du traitement
Pk.A;
Variable D Package X:=Pk.C;
Body …. Les combinaisons possibles
Procédure A
Procédure B ….
INSERT
…. Par ordre UPDATE
Y:=D; DELETE
Z:=C;
… AFTER/BEFORE
INSERT
Par ligne UPDATE
DELETE
• Dans un package, les procédures et fonctions peuvent être surchargées
• On supprime un package par : DROP PACKAGE nom_package ; ou
DROP PACKAGE BODY nom_package ; 4.3 Syntaxe de création
4. Les triggers bases de données CREATE TRIGGER nomtrigger séquence événement [OR événement]
ON nomtable
[REFERENCING {[OLD AS ancien] | [NEW AS nouveau]}
4.1 Définition [FOR EACH ROW]
[WHEN condition]
• Un trigger base de données est un ensemble de traitements PL/SQL Bloc_traitements
• Un trigger base de données est déclenché implicitement et
automatiquement par un ou plusieurs évènements prédéfinis. -Pour l’événement UPDATE on peut limiter la mise en oeuvre du traitement à la
• Un trigger base de données est attaché à une seule table modification de certaines colonnes : UPDATE OF nom_col [,nom_col…]
• Si une table est supprimée, les triggers de base de données qui sont -Un même déclencheur peut répondre à plusieurs événements. Dans ce cas il est
associés sont automatiquement supprimés possible d’utiliser les prédicats :
IF {INSERTING|DELETING|UPDATING} [(nom_col)] THEN … END IF
-On peut faire référence, dans la condition de la clause WHERE ou dans le corps
4.2 Caractéristique d’un trigger du traitement associé au déclencheur, la valeur d’une colonne avant
modification en préfixant le nom de colonne par OLD, et/ou à la valeur après
Un trigger base de données est identifié par cinq caractéristiques : modification en préfixant le nom de colonne par NEW. On évite d’utiliser OLD
• Un séquencement : et NEW en précisant la clause REFERENCING.
- BEFORE
- AFTER 4.4 Exemple
• Un type:
- par ordre
CREATE TRIGGER maj_livre
- par ligne
BEFORE
• Un événement qui le déclenche : DELETE OR INSERT OR UPDATE
- INSERT
Professeur : ASSALE Adjé Louis 7/14 INP-HB Professeur : ASSALE Adjé Louis 8/14 INP-HB
ORACLE Option procédurale ORACLE Option procédurale
ON Livre IFDELETING..
DECLARE
... EXEMPLE
BEGIN CREATE TRIGGER maj_livre
… BEFORE
END; DELETE OR INSERT OR UPDATE
Séquence de déclenchement des triggers ON Livre
Trigger before par ordre
Declare
N_Liv# Titre Auteur ...
Trigger par ligne before BEGIN
14 Ah les hommes Biton IF INSERTING OR UPDATING
Trigger par ligne after
THEN...
Trigger par ligne before
IF DELETING THEN...
17 Ah les femmes Biton Trigger par ligne after
END;
Trigger par ligne before
20 Tribaliques Lopez - Un trigger base de données peut être activé ou inhibé
Trigger par ligne after
Professeur : ASSALE Adjé Louis 9/14 INP-HB Professeur : ASSALE Adjé Louis 10/14 INP-HB
ORACLE Option procédurale ORACLE Option procédurale
* L’utilisation de la zone de partage des ordres SQL. Les droits d’accès ne sont plus donnés explicitement sur les objets mais
- Ce qui les différencie : sur les procédures stockées
* Un trigger base de données est associé à une et une seule table, - Intégrité
* Un trigger base de données est appelé implicitement, assure que les traitements dépendants sont exécutés simultanément
* Les ordres COMMIT, ROLLBACK et SAVEPOINT (marque le - Performance :
début d’une sous – transaction: savepoint nom_soustransaction, fin de la * Réduction du nombre d’appels à la base
sous-transaction par: Commit/Rollback to nom_soustransaction) sont * Utilisation de la zone de partage des ordres SQL
interdits dans les triggers base de données * Une seule copie du code pour plusieurs utilisateurs
* Un trigger base de données sera opérationnel jusqu’à la suppression - Productivité
de la table sur laquelle il est défini ou jusqu’à ce qu’il soit inhibé * Evite les redondances de procédures dans plusieurs applications
* Réduit les erreurs de programmation
- Trigger base de données ou trigger de transaction SQL*Forms ?
- Le trigger base de données : 5.2 Packages
* Se déclenche uniquement sur les ordres INSERT, UPDATE, et - Sécurité
DELETE * Accès uniquement aux déclarations du type public
* Se déclenche en supplément des triggers SQL*Forms * Les droits d’exécutions ne sont donnés que sur un package et non
* Se déclenche à partir de n’importe quel outil. plus individuellement sur les composants du package.
* Distingue les traitements par ordre et par lignes - Etat persistant :
- Le trigger de transaction SQL*Forms : * Conservation des valeurs des variables pour toute une session
* est associé à une seule application * Conservation des contextes des curseurs pour toute une session
* se déclenche uniquement quand l’application s’exécute - Performance :
*ne distingue pas les traitements par ordre de ceux qui concernent * Réduction du nombre d’appels à la base
toutes les lignes * Seul le premier appel charge en mémoire tout le package
* ne s’exécute qu’à la demande d’un COMMIT - Productivité
* Stockage dans la même entité de fonction et de procédure
- Les restrictions * Gestion facile de l’organisation des développements
Professeur : ASSALE Adjé Louis 11/14 INP-HB Professeur : ASSALE Adjé Louis 12/14 INP-HB
ORACLE Option procédurale ORACLE Option procédurale
6. Procédures du package DBMS_OUPUT d’Oracle 8 • Ecrire un trigger modif_effectif qui met à jour l’effectif des classes après
une insertion, destruction et modification de la classe d’un étudiant.
Oracle8 offre des procédures standardisées réunies dans le package
DBMS_OUTPUT qui peuvent être utilisées en mode procédural dans un bloc
PL/SQL.
Procédure Action
GET_LINE GET_LINE(ligne OUT, statut OUT)
Extrait une ligne du tampon de sortie.
GET_LINES GET_LINES(lignes OUT, n IN OUT)
Extrait un tableau de n lignes du tampon de sortie.
NEW_LINE NEW_LINE
Affiche la ligne générée par PUT et place un marqueur de
fin de ligne dans le tampon de sortie.
PUT PUT (variable / constante)
Place la valeur spécifiée dans le tampon de sortie.
PUT_LINE PUT_LINE (variable/constante)
Combinaison de PUT et de NEW_LINE
ENABLE ENABLE (taille_tampon)
Permet de mettre en route le mode trace dans une
procédure ou fonction.
DISABLE DISABLE
Permet de désactiver le mode trace dans une procédure ou
une fonction.
7. EXERCICE
Professeur : ASSALE Adjé Louis 13/14 INP-HB Professeur : ASSALE Adjé Louis 14/14 INP-HB