Module P2
Dalibo SCOP
24.09
29 août 2024
Formation | Module P2 |
Titre | PL/pgSQL avancé |
Révision | 24.09 |
https://dali.bo/p2_pdf | |
EPUB | https://dali.bo/p2_epub |
HTML | https://dali.bo/p2_html |
Slides | https://dali.bo/p2_slides |
TP | https://dali.bo/p2_tp |
TP (solutions) | https://dali.bo/p2_solutions |
Cette formation est sous licence CC-BY-NC-SA. Vous êtes libre de la redistribuer et/ou modifier aux conditions suivantes :
PostgreSQL® Postgres® et le logo Slonik sont des marques déposées par PostgreSQL Community Association of Canada.
Ce document ne couvre que les versions supportées de PostgreSQL au moment de sa rédaction, soit les versions 12 à 16.
FOREACH xxx IN ARRAY aaa LOOP
unnest
)anyelement
se voient attribués le même typeanyelement
autorisés$0
: du type attribué aux éléments
anyelement
anyarray
remplace tout tableau de type de données
simple ou composite
anyarray
se voient
attribués le même type# SELECT addition('un'::text, 'mot'::text);
ERREUR: L'opérateur n'existe pas : text + text
LIGNE 1 : SELECT $1 + $2
^
ASTUCE : Aucun opérateur correspond au nom donné et aux types d'arguments.
Vous devez ajouter des conversions explicites de type.
REQUÊTE : SELECT $1 + $2
CONTEXTE : PL/pgSQL function "addition" line 4 at assignment
INSERT
(incluant
COPY
), UPDATE
, DELETE
,
TRUNCATE
OLD
:
RECORD
correspondant à la ligne avant
modificationDELETE
et un UPDATE
NEW
:
RECORD
correspondant à la ligne après
modificationINSERT
et un UPDATE
NEW.champ1
pour accéder à la nouvelle valeur de
champ1
TG_NAME
TG_WHEN
BEFORE
, AFTER
ou
INSTEAD OF
suivant le type du triggerTG_LEVEL
ROW
ou STATEMENT
suivant le
mode du triggerTG_OP
INSERT
, UPDATE
,
DELETE
, TRUNCATE
suivant l’opération qui a
déclenché le triggerTG_RELID
OID
de la table qui a déclenché le triggerTG_TABLE_NAME
TG_TABLE_SCHEMA
TG_NARGS
TG_ARGV
trigger
ROW
, BEFORE
:
RETURN NEW;
avec trigger
BEFORE DELETE
ROW
, AFTER
: valeur de retour
ignoréeSTATEMENT
: valeur de retour ignoréeCREATE TRIGGER
permet quelques variantes :
CREATE TRIGGER name WHEN ( condition )
CREATE TRIGGER name BEFORE UPDATE OF colx ON my_table
CREATE CONSTRAINT TRIGGER
: exécuté qu’au moment de la
validation de la transactionCREATE TRIGGER view_insert INSTEAD OF INSERT ON my_view
AFTER
et de niveau
statementREFERENCING OLD TABLE
REFERENCING NEW TABLE
direction
du FETCH
:
NEXT
, PRIOR
FIRST
, LAST
ABSOLUTE nombre
, RELATIVE nombre
ALL
FORWARD
, FORWARD nombre
,
FORWARD ALL
BACKWARD
, BACKWARD nombre
,
BACKWARD ALL
CLOSE curseur
refcursor
INSERT
,
UPDATE
, DELETE
) est annuléeBEGIN
EXCEPTION
est
ignoréBEGIN
/END
comme si le bloc
d’exception n’existait pasBEGIN
/END
contenant (après annulation de ce que ce bloc a modifié en base)INSERT
,
UPDATE
, DELETE
de la fonction ont été
annuléesSQLSTATE
: code d’erreurSQLERRM
: message d’erreurData Exception
: division par zéro, overflow, argument
invalide pour certaines fonctions, etc.Integrity Constraint Violation
: unicité, CHECK, clé
étrangère, etc.Syntax Error
PL/pgSQL Error
: RAISE EXCEPTION
, pas de
données, trop de lignes, etc.RAISE niveau message
DEBUG
, LOG
, INFO
,
NOTICE
, WARNING
, EXCEPTION
%
est remplacé par la
valeur indiquée après le messageDETAIL
et HINT
disponibleslog_min_messages
client_min_messages
RAISE NOTICE message
, il faut avoir
soit log_min_messages
, soit
client_min_messages
, soit les deux à la valeur
NOTICE
au minimum.RAISE EXCEPTION message
EXCEPTION
gérant la
condition RAISE_EXCEPTION
BEGIN
/END
imbriqués vers les blocs
parents (fonctions appelantes comprises)INSERT
EXECUTE
GRANT
:REVOKE
REVOKE [ GRANT OPTION FOR ]
{ EXECUTE | ALL [ PRIVILEGES ] }
ON { { FUNCTION | PROCEDURE | ROUTINE } function_name
[ ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) ] [, ... ]
| ALL { FUNCTIONS | PROCEDURES | ROUTINES } IN SCHEMA schema_name [, ...] }
FROM { [ GROUP ] role_name | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
SECURITY INVOKER
SECURITY DEFINER
sudo
Unixsearch_path
LEAKPROOF
security_barrier
quote_ident
, quote_literal
et
quote_nullable
format
VOLATILE
volatile
: fonction dont l’exécution ne peut ni ne doit
être évitéeimmutable
: fonctions déterministes, dont le résultat
peut être précalculé avant de planifier la requête.stable
: fonction ayant un comportement
stable au sein d’un même ordre SQL.STRICT
NULL
si au moins un des arguments
est NULL
EXCEPTION
est plus
coûteuse en entrée/sortie qu’un bloc sans
SAVEPOINT
est créé à chaque fois pour pouvoir
annuler le bloc uniquement.BEGIN
imbriqué a un coût aussi
SAVEPOINT
est créé à chaque fois.EXECUTE
ou PERFORM
EXECUTE
,
PERFORM
…WHERE
shared_preload_libraries='auto_explain'
si globalALTER DATABASE erp SET auto_explain.log_min_duration = '3s'
LOAD 'auto_explain'
SET auto_explain.log_analyze TO true;
SET auto_explain.log_nested_statements TO true;
make USE_PGXS=1 && make USE_PGXS=1 install
shared_preload_libraries = 'log_functions'
LOAD 'log_functions'
SET
grep
très utileN’hésitez pas, c’est le moment !