Systèmes de Gestion de Bases de Données Procedural ...

53
Systèmes de Gestion de Bases de Données Procedural Language (PL)/SQL [email protected]

Transcript of Systèmes de Gestion de Bases de Données Procedural ...

Page 1: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de

Bases de Données

Procedural Language (PL)/SQL

[email protected]

Page 2: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 2

Introduction● SQL langage simple de manipulation des données

=> possibilité de requêtes longues et complexes● Architecture client/serveur et bloc d'instructions:

– ex. serveur web / SGBDR: le client doit envoyer une ou plusieurs requêtes au serveur, attend les résultats, les traitent, et renvoie si nécessaire d'autres requêtes au serveur

● Allers/retours de requêtes entre le client et le serveur● Surcharge du réseau● Attente du client

● Le langage SQL ne contient pas les fonctionnalités d'un langage évolué (boucles, variables, ...)

Page 3: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 3

PL/SQL en bref (1)● Procedural Language/SQL● PL-SQL comprend :

– la partie interrogation de SQL (Select, …) – la partie manipulation de SQL (Update, Insert,

Delete, …)

● PLUS :– une partie procédurale (des conditionnelles, des

boucles, des variables, des affectations, …)

PL/SQL est un langage algorithmique complet

Page 4: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 4

PL/SQL en bref (2)● Apport de PL/SQL

– Permet de créer des blocs d'instructions– Dans une architecture client/serveur SGBDR

permet d'améliorer la qualité de l'application:● Le traitement relatif à la BD est centralisé au niveau

du SGBDR● Réduit les allers/retours entre le client et le serveur

SGBDR● Seuls les résultats du traitement sont renvoyés, si

nécessaire au client

Page 5: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 5

PL/SQL en bref (3)● Quelques instructions « proches » de SQL:

– MANIPULATION: SELECT, INSERT, UPDATE, DELETE , …

– TRANSACTIONS: COMMIT, ROLLBACK, SAVEPOINT, SET TRANSACTION, LOCK TABLE, …

– FONCTIONS: TO_CHAR, TO_DATE, UPPER, SUBSTR, ROUND, ...

– CURSEURS : DECLARE, OPEN, FETCH, ...

● Des instructions propres à PL/SQL

● Impossible en PL/SQL: create table ou user, alter, drop table ou user

Page 6: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 6

PL/SQL et les SGBDR● Oracle:

– PL/SQL est le langage procédural d'Oracle– Syntaxe propre

● PostgreSQL:– PL/SQL est le langage procédural de PostgresSQL– Syntaxe issue d'autres langages de programmation:

● Soit intégrée: PL/C ● Soit fournie dans la distribution de PostgreSQL mais

à installer: PL/pgSQL (syntaxe proche du PL/SQL d'Oracle), PL/Tcl (syntaxe du TCL/TK), PL/Perl, PL/Python

● Soit maintenue en externe: PL/java, PL/php, PL/ruby, PL/scheme, PL/sh, ...

● MySQL: pas encore disponible

Page 7: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 7

PL/SQL et PostgreSQL (1)● Objectifs de PL/SQL dans postgreSQL = définir

des blocs d'instructions dans un langage SQL plus évolué que SQL:– créer des fonctions supplémentaires en plus des

fonctions internes et C existantes– utiliser la puissance d'autres langages de

programmation● Fonctionnement:

– Pas d'interpréteur intégré pour la compilation– Modules externes chargés de la compréhension et

la compilation des autres langages (gestionnaires écrit en C)

Page 8: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 8

PL/SQL et PostgreSQL (2)● Définition du code PL/SQL dans une fonction SQL

CREATE [ OR REPLACE ] FUNCTION nom ( [ [ mode_arg ] [ nom_arg ] type_arg [, ...] ] ) [ RETURNS type_retour ] { LANGUAGE nom_langage | IMMUTABLE | STABLE |

VOLATILE | CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER | AS 'definition' | AS 'fichier_objet', 'symbole_lien'

} ... [ WITH ( attribut [, ...] ) ]

● Appel de la fonction dans une requête SQL

Page 9: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 9

PL/SQL et PostgreSQL (3)● Exemple de définition

CREATE OR REPLACE FUNCTION my_funct(param1 integer, param2 numeric, param3 varchar(20)) returns integer as $$

bloc d'instructions basées sur la syntaxe du langage spécifié ci-dessous

$$ LANGUAGE plpgsql;● Exemples d'appel de la fonction suivant le type de

données renvoyéselect my_funct(5, 10, 'my_text');select * from my_funct(5, 10, 'my_text');

Page 10: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 10

Le langage procédural PL/pgSQL

Page 11: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 11

Structure du langage PL/pgsql (1)● À l'intérieur de la fonction, blocs d'instruction:

DECLARE (FACULTATIF)Déclaration des variables, constantes, exceptions et curseurs

BEGIN (OBLIGATOIRE)Instructions PL/SQLPossibilité de BLOCS imbriqués

EXCEPTION (FACULTATIF)Traitement des exceptions (gestion des "erreurs")

END; (OBLIGATOIRE)

Page 12: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 12

Structure du langage PL/pgsql (2)● Imbrication possibles des blocs (sauf dans la

partie declare)● Nommage des blocs possibles pour référencement

<<nom_bloc>>BEGIN

InstructionsEND nom_bloc ;

● Si bloc vide, begin optionnel, end obligatoire

Page 13: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 13

Structure du langage: Exemple● Chaque instruction est

terminée par un ; ● Les LABELS tels les

étiquettes de saut sont notés : <<LABEL>>

● Et les commentaires !-- comments Ou /* comments */

<<bloc1>>--- ceci est le bloc 1DECLARE

x numeric ;BEGIN

Instructions…

END bloc1 ;

<<bloc2>>/* Ceci est le bloc 2 */DECLAREx numeric ;BEGIN if x = bloc1.x then … end if;END bloc2 ;

Page 14: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 14

Les variables (1)● 2 grands types de variables en PL/pgSQL

– Variables de types postgreSQL : char, numeric, integer, date (DD-MON-YY), boolean…

– Variables propres à PL/pgSQL :● Types composites : record et table● Types références : cursor● Variable FOUND

Page 15: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 15

Les variables (2)● Définition des variables PL/SQL

– Dans la partie DECLARE du bloc PL/SQL.– Déclaration conventionnelle ou :

● Référence au type d'une colonne d'une table avec le type: nom_table.nom_colonne%TYPE

● Référence au type d'une ligne d'une table avec le type: nom_table%ROWTYPE

● Référence au type d'une ligne d'un curseur avec le type (dépend de la version de postgresql): nom_curseur%ROWTYPE

● Référence au type d'une variable (précédemment définie) avec le type : nom_var%TYPE

Page 16: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 16

Les variables (3)● Affectation des variables

– soit avec l'opérateur := suivi d'une constante, d'une expression ou d'une fonction PL/SQL

X := 5 ; tot := &SQ+3 ; Y := double(123) ;– soit lors de la commande PL/SQL select avec

l'opérateur into SELECT colonne INTO variable FROM TABLE;

Attention : (1) si le select retourne plusieurs valeurs il faut

utiliser un curseur(2) l'utilisation d'un select simple n'est pas autorisé

Page 17: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 17

Les variables (4)● L'attribut CONSTANT permet de figer l'affectation

d'une variable.Pi CONSTANT REAL := 3.14159 ;

● L'attribut NOT NULL interdit les valeurs nulles. present NOT NULL BOOLEAN := FALSE ;

● Les variables doivent être initialisées, cela peut être fait à la définition.

aire REAL := Pi * Rayon**2 ;

Page 18: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 18

Les variables (5)● Portée & visibilité des variables :

– Portée : les variables PL/SQL sont valides uniquement dans le bloc où elles sont déclarées (ainsi que dans les sous-blocs)

– Visibilité : si un sous-bloc déclare une variable de même nom, elle masque celle de niveau supérieur

DECLAREx number ;BEGIN

…DECLAREx real ;BEGIN…END;…

END;

Portée de x (number)

Portée de x (real)

DECLAREx number ;BEGIN

…DECLAREx real ;BEGIN…END;…

END;

Visibilité de x (number)

Visibilité de x (real)

Page 19: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 19

Les types de données (1)● Types issus de SQL

– Binary_integer –2.147.483.647 à 2.147.483.647– Numeric(précision, échelle) (38 digits)– Date– Char(longueur) : fixe– Varchar2(longueur) : variable– Long : chaîne de longueur variable– Raw(longueur) : idem varchar2

– + les sous types !!!!– boolean : TRUE ou FALSE ou NULL

Page 20: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 20

Les types de données (2)● Variable interne FOUND

– Booléen– Assignée lors de l'appel à certaines fonctions:

select, perform, execute, ...

Page 21: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 21

Les types de données (3)● Enregistrements

my_record record;– Regroupement de différentes données (champs)

dans une même structure– Utilisés principalement pour récupérer une ligne

d’une table– Pour accéder aux champs des enregistrements

my_record.nomchamp– Déclaration implicite : depart dept%rowtype

● Enregistrement correspondant à une ligne de la table dept, composé de champs identiques aux attributs de la table

Page 22: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 22

Les types de données (4)● Enregistrement: exemple

DECLAREemp_record record;

BEGINselect * into emp_record from emp where ename =

‘JONES’;raise notice 'Nom: %, empno: %', emp_record.ename,

emp_record.empno;END;

Page 23: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 23

Les conditionnelles (1)IF condition THEN

traitements

END IF ;DECLARE

salaire emp.sal%type;maxi numeric := 15000;

BEGINselect sal into salaire from emp

where ename = ‘JONES’;IF salaire < maxi THEN

salaire := salaire * 1.2;END IF ;

END;

Page 24: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 24

Les conditionnelles (2)IF condition THEN

traitements

ELSE traitements

END IF ;

DECLAREsalaire emp.sal%type;maxi numeric := 15000;

BEGINselect sal into salaire from emp where ename = ‘JONES’;IF salaire < maxi THEN salaire := salaire * 1.2;ELSE

salaire := salaire * 1.1;END IF ;

END;

Page 25: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 25

Les conditionnelles (3)IF condition THEN

traitements

ELSIF condition THEN traitements

END IF ;

DECLAREsalaire emp.sal%type;maxi numeric := 15000;

BEGINselect sal into salaire from emp where ename = ‘JONES’;IF salaire < maxi THEN salaire := salaire * 1.2;ELSIF salaire > maxi

salaire := salaire * 1.1;END IF ;

END;

Page 26: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 26

Les boucles (1)LOOP [LABEL]

traitementsEND LOOP [LABEL] ;

La commande EXIT [WHEN] permet de sortir de la boucle

DECLAREmaxi numeric := 10;i numeric :=0;

BEGINLOOP

i:=i+1;EXIT WHEN i = maxi;

END LOOP;END;

Page 27: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 27

Les boucles (2)FOR var IN [REVERSE] var-debut .. var-fin LOOP

TraitementsEND LOOP ;

● var est une variable pré-définie par la boucle (présence non obligatoire dans le bloc DECLARE

● var-debut et var-fin sont des variables ou des constantes.

● le pas d'incrément est de 1DECLARE

i numeric := 20;maxi numeric : =10;

BEGINfor i in 1..maxi loop

raise notice 'i: %', i;end loop;END;

Page 28: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 28

Les boucles (3)FOR var_record IN requête

TraitementsEND LOOP ;● var_record est une variable déclarée de type record

ou %rowtype● var_record contient un ou plusieurs enregistrements

issus de la requêteDECLARE

my_record record;BEGINfor my_record in select * from emp loop

raise notice 'nom: %, empno: %', my_record.ename, my_record.empno;

end loop;END;

Page 29: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 29

Les boucles (4)WHILE condition LOOP

traitementsEND LOOP;

● EXIT permet de sortir de la boucle avant la fin

DECLAREi numeric := 0;maxi numeric : =10;

BEGINwhile i < maxi loop

i:=i+1;end loop;

END;

Page 30: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 30

Les curseurs (1)● Zones mémoires utilisées:

– pour stocker le résultat d'une requête pour son traitement ultérieur (comportement similaire à la boucle For associée à une requête)

– pour renvoyer un ensemble de données à partir d'une fonction

● L'accès à ces zones mémoires se fait ligne par

ligne

● 3 types de curseurs :– Curseurs implicites– Curseurs explicites

Page 31: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 31

Les curseurs (2)● Curseur implicite : généré ET géré par le noyau lui-

même pour l'exécution d'ordres tels que le SELECT, INSERT ou UPDATE – Utilisation des boucles FOR+requête– Totalement transparent pour l’utilisateur

● Curseur explicite : créé et géré par l'utilisateur pour traiter un ordre SELECT qui retourne plusieurs enregistrements – sinon utilisation d’un simple select … into … from …

Page 32: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 32

Les curseurs explicites (1)● 4 étapes:

– déclaration – ouverture – traitements des lignes– fermeture

Page 33: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 33

Les curseurs explicites: déclaration● 3 déclarations possibles de curseurs:

– Curseurs non liés (à une requête): nom_curseur REFCURSOR;

– Curseurs liés:nom_curseur CURSOR FOR/IS ordre select SQL;

– Curseurs liés paramétrés:nom_curseur CURSOR (param1 type) FOR/IS ordre

select SQL;

Page 34: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 34

Les curseurs explicites: ouverture et fermeture (1)● Allocation mémoire faite lors de l’ouverture suivie

d’une analyse sémantique et syntaxique de l'ordre SELECT (les erreurs arrivent ici !)

● Ouverture & fermeture réalisées dans le bloc traitement : OPEN & CLOSE

● Deux formats d'ouverture suivant la nature du curseurs explicites:– Curseurs liés:

Open nom_curseur;– Curseurs non liés – association à la requête:

Open nom_curseur for select ...;

Page 35: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 35

Les curseurs explicites: ouverture et fermeture (2)● Exemple

DECLAREmy_curseur refcursor

BEGIN …OPEN my_curseur for select * from emp;

traitementsCLOSE my_curseur;

…END;

Page 36: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 36

Les curseurs explicites: traitement des lignes● Traitement ligne à ligne grâce à la commande

fetch ... into● réception des lignes résultat dans des variables

record ou %rowtype définies dans le bloc FETCH nom_curseur INTO malignecurseur ;

● Fetch ne ramène qu'une ligne à la fois● Passe à ligne suivante automatiquement

Page 37: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 37

Les curseurs et boucles (1)● Boucle LOOP : utilisation complètement manuelle

des curseurs : – Déclaration– Ouverture – Traitement et Incrémentation par fetch– Arrêt grâce à la variable FOUND– Fermeture

Page 38: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 38

Les curseurs et boucles (2)DECLARE

employe CURSOR IS SELECT * from emp;

ligne_emp em%ROWTYPE;BEGIN

OPEN employe; LOOP

FETCH employe INTO ligne_emp ; EXIT WHEN NOT FOUND;raise notice 'nom: %, job: %',

ligne_emp.ename, ligne_emp.job;END LOOP;

CLOSE employe;END;

Déclaration curseur & record

Incrémentation Test de fin

Ouverture

Fermeture

Page 39: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 39

Les curseurs paramétrés (1)● Initialisation des paramètres dans la déclaration

des curseurs liés paramétrésnom_curseur cursor (paral type1, para2 type2, ...)

IS SELECT... ; (utilisant les paramètres)

Note : Types donnés sans longueur (char, numeric, varchar2)

● A l'utilisation, il faut donner les valeurs des paramètres:OPEN nom_curseur (val1, val2,.. .);

Page 40: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 40

Les curseurs paramétrés (2)DECLARE

employe CURSOR (dep numeric) IS SELECT * from emp where deptno=dep;

ligne_emp em%ROWTYPE;BEGIN

OPEN employe(20); LOOP

FETCH employe INTO ligne_emp ; EXIT WHEN NOT FOUND;raise notice 'nom: %, job: %', ligne_emp.ename,

ligne_emp.job;END LOOP;

CLOSE employe;END;

Page 41: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 41

Gestion des erreurs ou exceptions (1)● Permet de réserver un traitement spécifique à

chaque erreur● 2 types d'erreurs :

– les erreurs internes postgreSQL– les erreurs « définies » par l'utilisateur

● Lors d'une erreur, l'exécution s'interrompt et le traitement associé dans le bloc exception s'exécute

● A la fin de l'exécution, le traitement reprend après le bloc exception:– Toutes les instructions prévues dans le bloc begin

end correspondant (hors exception) sont annulées !

Page 42: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 42

Gestion des erreurs ou exceptions (2)● Lors de la levée d'une exception, toutes

modifications sur les données des tables à l'intérieur du bloc d'instructions à l'origine de l'exception sont annulées. La base de données revient dans son état initial suite à l'exception

● Suivant le cas, utile d'imbriquer différents blocs d'instruction begin/end pour une meilleure gestion des exceptions

Page 43: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 43

Gestion des erreurs ou exceptions (3)

DECLAREBEGIN

BEGIN/* Bloc traitements pouvant lever une exception*/instruction1;instruction2 qui lève l'exception; instruction3 qui ne sera pas exécutée;

EXCEPTIONWHEN condition THEN traitement;WHEN condition THEN traitement;...

END;instruction suivante exécutée;

END;

Page 44: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 44

Gestion des erreurs ou exceptions (4)● Différents types d'exception pré-définis =>

différentes conditions possibles dans le WHEN du bloc exception:– Connection failure– Data exception– Integrity constraint violation– Syntax error– ...

Page 45: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 45

Gestion des erreurs ou exceptions (5)

Create or replace function div(num real, denom real) returns real as $$

DECLARE y real;

BEGINy := num / denom;raise notice 'y: %', y;return y;exception

when division_by_zero thenraise notice 'denom est egal à %', denom;

return y;END;select div(10,0);

Page 46: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 46

Gestion des erreurs utilisateurs (1)● Possibilité de rapporter des messages et lever des

erreurs grâce à la commande raise● Différents niveaux possibles: debug, log, info,

notice, warning et exception● Seul le niveau exception lève une exception au

niveau du système récupérable par le bloc exception:– Condition de test dans le WHEN:

RAISE_EXCEPTION

Page 47: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 47

Gestion des erreurs utilisateurs (2)Create or replace function div(num real, denom real) returns

real as $$DECLARE

y real;BEGIN

if denom = 0 then raise exception 'Exception user';end if;y := num / denom;return y;exception

when raise_exception thenraise notice 'denom est egal à %', denom;

return y;END;select div(10,0);

Page 48: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 48

Triggers (1)● Trigger=Déclencheur:

– Déclenchement lors d'une opération particulière sur une table: insert, update, delete. Ne peut agir sur un select

– Gestionnaire de déclencheurs● Chaque trigger est associé à une fonction trigger● 2 types de triggers

– Trigger par ligne: fonction trigger appelée pour chaque ligne affectée par l'opération

– Trigger par instruction: fonction trigger appelée une seule fois pour l'ensemble des lignes affectées

● Exécution de la fonction trigger possible avant ou après l'opération

Page 49: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 49

Triggers (2)● Définition d'un trigger

CREATE TRIGGER nom { BEFORE | AFTER}{ opération [ OR ...] }ON table [ FOR [ EACH ] { ROW | STATEMENT } ]EXECUTE PROCEDURE nom_fonction ( arguments )

● Destruction d'un triggerDROP TRIGGER nom on nom_table;

● Définition de la fonction triggerCREATE [ OR REPLACE ] FUNCTION nom ( )RETURNS trigger as $$...$$ LANGUAGE plpgsql;

Page 50: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 50

Triggers (3)● Définition de la fonction trigger

– Aucun argument possible– Type de retour obligatoire: trigger => retour d'une

valeur NULL ou d'un record● Trigger type BEFORE et par ligne: si retour NULL;

l'opération INSERT ou UPDATE est annulée; si retour d'un enregistrement, il sera utilisé pour l'insertion ou la modification. Pas d'influence sur l'opération delete

● Trigger type AFTER/BEFORE et par instruction ou de type AFTER et par ligne: le type de retour n'a pas de conséquence

– Si une exception est levée pendant l'exécution de la fonction, l'opération associée est annulée

Page 51: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 51

Triggers (4)● Variables prédéfinies, créées et affectées par le

gestionnaire de déclencheurs– NEW (record): nouvelle ligne utilisée par

INSERT/UPDATE pour les triggers par ligne– OLD (record): ancienne ligne pour UPDATE/DELETE

pour les triggers en ligne – TG_NAME (name), TG_WHEN (text), TG_LEVEL (text):

informations sur le trigger – nom, type (BEFORE/AFTER), niveau (RAW/STATEMENT)

– TG_OP (text): type d'opération associée au trigger (UPDATE/INSERT/DELETE)

– TG_RELID (OID), TG_RELNAME (name): Id attribut et nom de la table associé au trigger

– TG_NARGS (integer), TG_ARGV[] (text): nombre et liste d'arguments passés lors de la création du trigger

Page 52: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 52

Triggers (5)

Create or replace function verif_emp() returns trigger as $$declare

maxval numeric;begin

if(NEW.mgr is NULL) thenselect max(empno) into maxval from emp;NEW.mgr := maxval;

end if;returns NEW;

end;

$$ LANGUAGE plpgsql;

Page 53: Systèmes de Gestion de Bases de Données Procedural ...

Systèmes de Gestion de Bases de Données 53

La suite en TP ...