FirebirdSQL logo

En-tête du module

L’en-tête contient le nom du module et la description des variables locales. Pour les procédures stockées et les blocs PSQL, l’en-tête peut contenir la description des paramètres d’entrée et de sortie. L’en-tête du déclencheur ne peut pas contenir de paramètres d’entrée et de sortie.

L’en-tête du déclencheur doit contenir un événement (ou une combinaison d’événements), auquel le déclencheur sera appelé automatiquement.

Privilèges d’exécution de code PSQL

Le code PSQL peut être exécuté dans l’un des modes suivants :

  • Avec des privilèges d’utilisateur appelant (privilèges CURRENT_USER) ;

  • En définissant les privilèges de l’utilisateur (propriétaire de l’objet de métadonnées).

Les privilèges d’exécution du module PSQL sont spécifiés dans son en-tête dans la clause optionnelle SQL SECURITY.Si l’option INVOKER est sélectionnée, le module PSQL est exécuté avec les privilèges de l’utilisateur appelant.Si l’option DEFINER est sélectionnée, le module PSQL est exécuté avec les privilèges de l’utilisateur définissant (propriétaire). Ces privilèges seront complétés par des privilèges accordés au module PSQL lui-même à l’aide de l’Instruction GRANT.Par défaut, les procédures, les fonctions sont exécutées avec les privilèges de l’utilisateur appelant, et les déclencheurs héritent des privilèges de sécurité spécifiés pour la table.

Les blocs PSQL anonymes (EXECUTE BLOCK) sont toujours exécutés avec les privilèges de l’appelant.

Corps du module

Le corps du module peut être écrit en PSQL ou être le corps d’un module externe.

Syntaxe corps du module
<routine-body> ::=
    <psql-routine-spec>
  | <external-routine-spec>

<psql-routine-spec> ::=
  [<rights-clause>] <psql-routine-body>


<rights-clause> ::=
  SQL SECURITY {DEFINER | INVOKER}


<psql-routine-body> ::=
  AS
    [<declarations>]
  BEGIN
    [<PSQL_statements>]
  END

<declarations> ::=
  <declare-item> [<declare-item> ...]

<declare-item> ::=
    <declare-var>;
  | <declare-cursor>;
  | <subroutine-declaration>;
  | <subroutine-implementation>

<subroutine-declaration> ::= <subfunc-decl> | <subproc-decl>

<subroutine-implementation> ::= <subfunc-impl> | <subproc-impl>

<external-routine-spec> ::=
  <external-routine-reference>
  [AS <extbody>]

<external-routine-reference> ::= EXTERNAL NAME <extname> ENGINE <engine>

<extname> ::=
  '<module-name>!<routine-name>[!<misc-info>]'
Table 1. Paramètres du corps du module
Paramètre Description

declare-var

Déclaration d’une variable locale.

declare-cursor

Déclaration d’un curseur nommé.

subfunc-decl

Déclaration d’un sous-programme - fonction.

subproc-decl

Déclaration d’un sous-programme - procédure.

subfunc-impl

Mise en œuvre de la fonction du sous-programme.

subproc-impl

Mise en œuvre du sous-programme - procédures.

extbody

Le corps de la procédure externe. Chaîne littérale qui peut être utilisée par l’UDR à diverses fins.

module-name

Nom du module externe dans lequel se trouve la fonction.

routine-name

Nom de la fonction interne dans un module externe.

misc-info

Informations définies par l’utilisateur à envoyer à une fonction de module externe.

engine

Nom du moteur pour utiliser les fonctions externes. Habituellement, le nom de l’UDR est spécifié.

Corps du module PSQL

Le corps PSQL commence par une section facultative dans laquelle sont déclarés les variables, les curseurs et les sous-programmes. Cette section est suivie d’un bloc d’instructions, qui sont exécutées dans une séquence logique en tant que programme. Le bloc d’instructions - ou instruction composée - est entouré des mots-clés BEGIN et END et est exécuté comme un seul bloc de code. Le bloc principal BEGIN …​ END peut contenir un nombre quelconque d’autres blocs BEGIN …​ END, soit en ligne ou séquentiel. L’imbrication maximale des blocs est de 512 niveaux. Toutes les instructions sauf BEGIN et END se terminent par un point-virgule (“;”). Aucun autre caractère ne peut être utilisé comme terminaison pour les instructions PSQL.

Modifier le terminateur dans isql

Nous allons faire une petite digression ici pour expliquer comment changer le terminateur dans l’utilitaire isql. Ceci est nécessaire pour pouvoir définir des modules PSQL dans celui-ci sans entrer en conflit avec isql lui-même, qui utilise le même symbole, le point-virgule ( ;), comme séparateur d’instruction.