PL/SQL
Marc Plantevit
marc.plantevit@liris.cnrs.fr
Pourquoi PL/SQL ?
PL/SQL = PROCEDURAL LANGUAGE/SQL
SQL est un langage non proc´edural
Les traitements complexes sont parfois difficiles `a ´ecrire si on ne peut utiliser des variables et les structures de
programmation comme les boucles et les alternatives On ressent vite le besoin d’un langage proc´edural pour lier plusieurs requˆetes SQL avec des variables et dans les structures de programmation habituelles
2 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Principales Caract´
eristiques
Extension de SQL : des requˆetes SQL cohabitent avec les
structures de contrˆole habituelles de la programmation structur´ee (blocs, alternatives, boucles).
La syntaxe ressemble au langage Ada ou Pascal.
Un programme est constitu´e de proc´edures et de fonctions.
Des variables permettent l’´echange d’information entre les
requˆetes SQL et le reste du programme
3 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Utilisation de PL/SQL
PL/SQL peut ˆetre utilis´e pour l’´ecriture des proc´edures stock´ees et des triggers.
Oracle accepte aussi le langage Java.
Il convient aussi pour ´ecrire des fonctions utilisateurs qui peuvent ˆetre utilis´ees dans les requˆetes SQL (en plus des fonctions pr´ed´efinies).
Il est aussi utilis´e dans des outils Oracle Ex : Forms et Report.
4 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Utilisation de PL/SQL (suite)
Le PL/SQL peut ˆetre utilis´e sous 3 formes :
1 un bloc de code, ex´ecut´e comme une unique commande SQL,
via un interpr´eteur standard (SQLplus ou iSQL*PLus)
2 un fichier de commande PL/SQL
3 un programme stock´e (proc´edure, fonction, trigger)
5 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Blocs
Un programme est structur´e en blocs d’instructions de 3
types :
proc´edures ou bloc anonymes, proc´edures nomm´ees, fonctions nomm´ees.
Un bloc peut contenir d’autres blocs.
Consid´erons d’abord les blocs anonymes.
7 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Structure d’un bloc anonyme
DECLARE
-- d´efinition des variables
BEGIN
-- code du programme EXCEPTION
-- code de gestion des erreurs
END ;
Seuls BEGIN et END sont obligatoires Comme les instruction SQL, les blocs se terminent par un ;
8 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
D´
eclaration, initalisation des variables
Identificateurs Oracle : 30 caract`eres au plus, commence par une lettre,
peut contenir lettres, chiffres, , $ et # pas sensible `a la casse.
Port´ee habituelle des langages `a blocs Doivent ˆetre d´eclar´ees avant d’ˆetre utilis´ees
9 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
D´eclaration et initialisation
Nom variable type variable := valeur ; Initialisation
Nom variable := valeur ;
D´eclarations multiples interdites.
Exemples : age integer ; nom varchar(30) ; dateNaissance date ; ok boolean := true ; 10 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Plusieurs fa¸
cons d’affecter une valeur `
a une variable
Op´erateur d’affectation n :=.
Directive INTO de la requˆete SELECT.
Exemple
dateNaissance :=
to date(’10/10/2004’,’DD/MM/YYYY’) ; SELECT nom INTO v nom
FROM emp
WHERE matr = 509 ;
Pour ´eviter les conflits de nommage, pr´efixer les variables PL/SQL par v
11 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
SELECT . . . INTO . . .
SELECT expr1,expr2, . . . INTO var1, var2, . . .
Met des valeurs de la BD dans une ou plusieurs variables var1, var2, . . .
Le select ne doit retourner qu’une seule ligne
Avec Oracle il n’est pas possible d’inclure un select sans
into dans une proc´edure.
Pour retourner plusieurs lignes, voir la suite du cours sur les curseurs.
12 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Types de Variables
VARCHAR2
Longueur maximale : 32767 octets ; Syntaxe : Nom variable VARCHAR2(30) ; Exemples :
name VARCHAR2(30) ; name VARCHAR2(30) := ’toto’ ;
NUMBER(long,dec)
Long : longueur maximale ; Dec : longueur de la partie d´ecimale ; Exemples :
num telnumber(10) ; toto number(5,2)=142.12 ;
13 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
DATE
Par d´efaut DD-MON-YY (18-DEC-09) ;
Fonction TO DATE ; Exemples :
start date := to date(’29-SEP-2003’,’DD-MONYYYY’) ; start date :=
to date(’29-SEP-2003 :13 :01’,’DD-MONYYYY :HH24 :MI’) ;
BOOLEAN
TRUE FALSE NULL
14 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
D´
eclaration %TYPE et %ROWTYPE
v nom emp.nom.%TYPE ;
On peut d´eclarer qu’une variable est du mˆeme type qu’une colonne d’une table ou (ou qu’une autre variable).
v employe emp%ROWTYPE ;
Une variable peut contenir toutes les colonnes d’un tuple d’une table (la variable v employe contiendra une ligne de la table emp.
15 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Exemple
DECLARE -- D´eclaration v employe emp%ROWTYPE ; v nom emp.nom.%TYPE ; BEGINSELECT * INTO v employe FROM emp WHERE matr = 900 ; v nom := v employe.nom ;
v employe.dept := 20 ; . . .
/* On ins`ere un tuple dans la base*/
INSERT into emp VALUES v employe ; END ;
V´erifiez `a bien retourner un seul tuple avec la requˆete SELECT ... INTO ...
16 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Test Conditionnel
IF-THEN
IF v date > ’01-JAN-08’ THEN v salaire := v salaire * 1.15 ; END IF ;
IF-THEN-ELSE
IF v date > ’01-JAN-08’ THEN v salaire := v salaire * 1.15 ; ELSE
v salaire := v salaire * 1.05 ; END IF ;
IF-THEN-ELSIF
IF v nom = ’PARKER’ THEN v salaire := v salaire * 1.15 ; ELSIF v nom = ‘SMITH’ THEN v salaire := v salaire * 1.05 ;
CASE
CASE s´electeur
WHEN expression1 THEN r´esultat1
WHEN expression2 THEN r´esultat2
ELSE r´esultat3
END ;
Le CASE renvoie une valeur qui vaut r´esultat1 ou r´esultat2 ou . . . Ce n’est pas une instruction.
Exemple
val := CASE city
WHEN ’TORONTO’ THEN ’RAPTORS’ WHEN ’LOS ANGELES’ THEN ‘LAKERS’ WHEN ’SAN ANTONIO’ THEN ’SPURS’ ELSE ’NO TEAM’
END ;
19 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Les Boucles
LOOP
instructions ex´ecutables ;
EXIT[WHEN condition] ;
instructions ex´ecutables ;
END LOOP ;
Obligation d’utiliser la commande EXIT pour ´eviter une boucle infinie, facultativement quand une condition est vraie.
WHILE condition LOOP
instructions ex´ecutables ;
END LOOP ;
-- Tant que la condition est vraie ...
20 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
FOR
FOR variable IN debut .. fin LOOP
instructions ; END LOOP ;
La variable de boucle prend successivement les valeurs de debut, debut + 1, debut + 2, . . ., jusqu’`a la valeur fin.
On pourra ´egalement utiliser un curseur dans la clause IN
(dans quelques slides).
21 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Affichage
Activer le retour ´ecran :
set serveroutput on size 10000
Affichage
dbms output.put line(cha^ıne) ; Utilise || pour faire une concat´enation.
22 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Exemple
set serveroutput on DECLARE i number(2) ; BEGIN FOR i IN 1..5 LOOP dbms output.put line(’Nombre : ’ || i) ; END LOOP ; END ; /Si ’/’ seul sur une ligne : fin d’une d´efinition (d´eclenche l’´evaluation).
23 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Exemple bis
DECLARE
compteur number(3) ; i number(3) ; BEGIN
select count(*) into compteur from EtudiantLIF10 ; FOR i IN 1..compteur LOOP
dbms output.put line(’Nombre : L3IF ’ || i ) ; END LOOP ;
END ;
24 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Overview
Toutes les requˆetes SQL sont associ´ees `a un curseur. Ce curseur repr´esente la zone m´emoire utilis´ee pour parser (analyser) et ex´ecuter la requˆete.
Le curseur peut ˆetre implicite(pas d´eclar´e par l’utilisateur) ou explicite/
Les curseurs explicites servent `a retourner plusieurs lignes avec un select.
26 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Attributs des curseurs
Tous les curseurs ont des attributs que l’utilisateur peut utiliser.
%ROWCOUNT :
Nombre de lignes trait´ees par le curseur
%FOUND
Vrai si au moins une ligne a ´et´e trait´ee par la requˆete ou le dernier fetch.
%NOTFOUND
Vrai si aucune ligne n’a ´et´e trait´ee par la requˆete ou le dernier fetch
%ISOPEN
Vrai si le curseur est ouvert (utile seulement pour les curseurs explicites)
27 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Les curseurs implicites
Les curseurs implicites sont tous nomm´es SQL
Exemple
DECLARE
nb lignes integer ; BEGIN
delete from emp where dept = 10 ; nb lignes := SQL%ROWCOUNT ; ...
END ;
28 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Les curseurs explicites
Pour traiter les select qui renvoient plusieurs lignes.
Ils doivent ˆetre d´eclar´es.
Le code doit les utiliser explicitement avec les ordres OPEN, FETCH et CLOSE
OPEN moncurseur : ouvre le curseur.
FETCH moncurseur : avance le curseur `a la ligne suivante. OPEN moncurseur : referme le curseur.
Le plus souvent on les utilise dans une boucle dont on sort quand l’attribut NOTFOUND du curseur est vrai. On les utilise aussi dans une boucle FOR qui permet une utilisation implicite des instructions OPEN, FETCH et CLOSE.
29 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Exemple Curseurs Explicites
BEGIN
open salaires ; LOOP
FETCH salaires into salaire ; EXIT when salaires%notfound ; IF salaire is not null THEN total := total + salaire ; DBMS OUTPUT.put line(total) ; END IF ; END LOOP ; CLOSE salaires ; DBMS OUTPUT.put line(total) ; END ;
Ne pas oublier de fermer le curseur.
30 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Type Row associ´
e `
a un curseur
On peut d´eclarer un typerow associ´e `a un curseur :
DECLARE
CURSOR c IS SELECT matr, nom, sal FROM emp ; employe c%ROWTYPE ;
BEGIN open c ;
fetch c into employe ;
IF employe.sal IS NOT NULL THEN ...
END ;
31 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Boucle FOR pour un curseur
Elle simplifie la programmation car elle ´evite d’utiliser explicitement les instruction OPEN, FETCH, CLOSE. En plus elle d´eclare implicitement une variable de type ROW associ´ee au curseur.
32 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Boucle FOR pour un curseur
DECLARE
nom varchar2(30) ;
CURSOR c nom clients IS SELECT nom,adresse FROM clients ;
BEGIN
FOR le client IN c nom clients LOOP
dbms output.put line(’Employ´e : ’ ||
UPPER(le client.nom) ||’ Ville : ’|| le client.adresse) ;
END LOOP ; END ;
Pr´efixer le nom d’un curseur par c pour ´eviter les confusions de nommage.
33 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Curseurs param´
etr´
es
Un curseur param´etr´e peut servir plusieurs fois avec des valeurs des param`etres diff´erentes.
On doit fermer le curseur entre chaque utilisation de param`etres diff´erents (sauf si on utilisefor qui ferme automatiquement le curseur).
34 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Exemple
DECLARE
-- D´eclaration du param`etre du curseur.
CURSOR c(p dept integer) IS select dept, nome from emp where dept = p dept ;
BEGIN
-- Instantiation du param`etre avec le dept 10.
FOR employe in c(10) LOOP
dbms output.put line(employe.nome) ; END LOOP ;
-- Instantiation du param`etre avec le dept 20.
FOR employe in c(20) LOOP
dbms output.put line(employe.nome) ; END LOOP ;
END ;
35 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Les Exceptions
Une exception est une erreur qui survient durant une ex´ecution.
2 types d’exception : pr´ed´efinie par Oracle, d´efinie par le programmeur. Saisir une exception :
Une exception ne provoque pas n´ecessairement l’arrˆet du programme si elle est saisie par un bloc (dans la partie
EXCEPTION).
Une exception non saisie remonte dans la proc´edure appelante (o`u elle peut ˆetre saisie).
37 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Exceptions Pr´
ed´
efinies
NO DATA FOUND
Quand Select into ne retourne aucune ligne.
TOO MANY ROWS
Quand Select into retourne plusieurs lignes.
VALUE ERROR
Erreur num´erique.
ZERO DIVIDE
Division par z´ero.
OTHERS
Toutes erreurs non intercept´ees.
38 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Traitement des exceptions
BEGIN ... EXCEPTION
WHEN NO DATA FOUND THEN ...
WHEN TOO MANY ROWS THEN ...
WHEN OTHERS THEN --optionnel ...
END ;
39 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Exceptions Utilisateur
Elles doivent ˆetre d´eclar´ees avec le type EXCEPTION. On les l`eve avec l’instruction RAISE.
DECLARE
salaire numeric(8,2) ; salaire trop bas EXCEPTION ; BEGIN
select sal into salaire from emp where matr = 50 ; IF salaire < 300 THEN
RAISE salaire trop bas ; END IF ;
EXCEPTION
WHEN salaire trop bas THEN
dbms output.put line(‘Salaire trop bas’) ; WHEN OTHERS THEN
dbms output.put line(SQLERRM) ; END ;
40 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Bloc anonyme ou nomm´
e
Un bloc anonyme PL/SQL est un blocDECLARE
–BEGIN –END comme dans les exemples pr´ec´edents.
On peut ex´ecuter directement un bloc PL/SQL anonyme en
tapant sa d´efinition.
Le plus souvent, on passe plutˆot une proc´edure ou une
fonction nomm´ee pour r´eutiliser le code.
42 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Proc´
edures sans param`
etre
CREATE OR REPLACE PROCEDURE list nom clients IS
BEGIN DECLARE
nom varchar2(30) ;
CURSOR c nom clients IS select nom,adresse from clients ;
BEGIN
FOR le client IN c nom clients LOOP
dbms output.put line(’Employ´e : ’ ||
UPPER(le client.nom) ||’ Ville : ‘|| le client.adresse) ;
END LOOP ; END ; END ;
SET SERVEROUTPUT ON ; CALL list nom clients() ;
43 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Proc´
edures avec param`
etres
create or replace procedure list nom clients
(ville IN varchar2, result OUT number) IS
BEGIN DECLARE
CURSOR c nb clients IS select count(*) from clients where adresse=ville ;
BEGIN
open c nb clients ; fetch c nb clients INTO result ;
close c nb clients ; END ;
END ;
IN : en lecture seule OUT : en ´ecriture seule IN OUT : en lecture/´ecriture
44 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Un peu plus ...
D´eclarer une variable : variable nb number ; Ex´ecuter la fonction :
execute list nom clients(’paris’, :nb) ; (Une variable
globale s’utilise avec le pr´efixe :) Visualisation du r´esultat : print ;
Description des param`etres : desc nom procedure
45 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Fonctions sans param`
etre
CREATE OR REPLACE FUNCTION nombre clients
-- D´eclaration du type de retour de la fonction
RETURN NUMBER IS
BEGIN DECLARE
i NUMBER ;
CURSOR get nb clients IS select count(*) from clients ;
BEGIN
open get nb clients ; fetch get nb clients INTO i ; return i ;
END ; END ;
Ex´ecution :
select nombre clients() from dual ;
46 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Fonctions avec param`
etres
Seuls les param`etres IN (en lecture seule) sont autoris´es pour les fonctions.
create or replace function euro to fr(somme IN number)
return number IS
taux constant number := 6.55957 ;
BEGIN return somme * taux ;
END ; /
show errors ; -- appel :
select euro to fr(10) from dual ;
47 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Proc´
edures et Fonctions
Suppression de proc´edures ou fonctions : DROP PROCEDURE nom procedure DROP FUNCTION nom fonction
Table syst`eme contenant les proc´edures et fonctions : user source ;
Les proc´edures et fonctions peuvent ˆetre utilis´ees dans d’autres
proc´edures ou fonctions ou dans des blocs PL/SQL anonymes.
Les fonctions peuvent aussi ˆetre utilis´ees dans les requˆetes SQL.
48 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Les d´
eclencheurs (triggers)
Les contraintes pr´ed´efinies ne sont pas toujours suffisantes. Ex. : tout nouveau prix d’un produit doit avoir une date de d´ebut sup´erieure `a celle des autres prix pour ce produit (pas de prix antidat´es).
Automatiser des actions lors de certains ´ev´enements du type : AFTER ou BEFORE et INSERT, DELETE ou UPDATE Syntaxe :
CREATE OR REPLACE TRIGGER nom trigger
Ev´enement [OF liste colonne] ON nom table
WHEN (condition) [FOR EACH ROW] Instructions PL/SQL ou SQL
50 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Acc`
es aux valeurs modifi´
ees
Utilisation de new et old.
Si nous ajoutons un client dont le nom est toto alors nous r´ecup´erons ce nom grˆace `a la variable :new.nom.
Dansle cas de suppression ou modification, les anciennes valeurs sont dans la variable :old.nom.
51 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Exemple
Archiver le nom de l’utilisateur, la date et l’action effectu´ee (toutes les informations) dans une table LOG CLIENTS lors de l’ajout d’un clients dans la table CLIENTS.
Cr´eer la table LOG CLIENTS avec la mˆeme structure que
CLIENTS.
Ajouter 3 colonnes USERNAME, DATEMODIF, TYPEMODIF.
create or replace trigger logadd after insert on clients
for each row BEGIN
insert into log clients values
( :new.nom, :new.adresse, :new.reference, :new.nom piece, :new.quantite, :new.prix, :new.echeance, USER,SYSDATE,’INSERT’) ;
END ;
52 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Pr´
edicats Conditionnels
Lorsqu’un trigger a plusieurs op´erations d´eclenchantes (ON INSERT OR DELETE OR UPDATE OF EMP), le corps du trigger peut avoir des pr´edicats conditionnels :
IF INSERTING THEN ... END IF ; IF UPDATING THEN ... END IF ;
On peut pr´eciser les colonnes soumises aux op´erations d´eclenchantes :
CREATE TRIGGER ...
... UPDATE OF sal, commission ON EMP ... BEGIN ... IF UPDATING(’SAL’) THEN ... END IF END ; 53 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Les commandes de d´efinition de donn´ees (LDD) et les commandes de contrˆole de transactions ne sont pas permises dans le corps d’un trigger. Ainsi, les commandes ROLLBACK, COMMIT, ..., ne doivent pas ˆetre utilis´ees dans le corps d’un trigger.
54 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Tables Mutantes et Tables Contraignantes
Une table mutante est une table en cours de modification par
une op´eration d´eclenchante (UPDATE, DELETE,
INSERTION) ou l’effet de DELETE CASCADE provenant de cette op´eration.
Une table contraignante est une table qu’une op´eration
d´eclenchante doit lire, soit directement via une commande
SQL (UPDATE SET ... WHERE) ou indirectement pour une contrainte d’int´egrit´e r´ef´erentielle.
Les commandes SQL dans le corps d’un trigger ne peuvent pas :
Lire (par une requˆete) ou modifier un table mutante d’une op´eration d´eclenchante.
Changer des valuers sur les colonnes de cl´es (PRIMARY, FOREIGN, UNIQUE) d’une table contraignante.
Ces restrictions permettent d’´eviter la consultation d’une table dans un ´etat transitoire et donc incoh´erent.
55 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Exemple d’erreur
CREATE OR REPLACE TRIGGER emp count AFTER DELETE ON emp
FOR EACH ROW DECLARE n INTEGER ; BEGIN
SELECT COUNT(*) INTO n FROM emp ;
DBMS OUTPUT.PUT LINE(’On a ’|| n || ’employ´es dans la
base’) ;
DELETE FROM emp WHERE empno = 7499 ;
On a l’erreur suivante :
ORA-04091 : table SCOTT.EMP is mutating, trigger/function may not see it.
56 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers
Le dictionnaire de donn´ees a des vues sur les triggers : USER TRIGGERS, ALL TRIGGERS, DBA TRIGGERS. Exemple : SELECT trigger type, triggering event, table name FROM user triggers ;
57 Le Langage PL/SQL Commandes Les curseurs Les exceptions Proc´edures et fonctions Triggers