FirebirdSQL logo
 PROCEDUREPACKAGE 

Valeur de retour

La phrase RETURNS spécifie le type de valeur de retour de la fonction stockée. Si la fonction retourne une valeur de type chaîne de caractères, il est possible de spécifier l’ordre de tri en utilisant la phrase COLLATE. Le type de valeur de retour peut être un nom de domaine, une référence à son type (en utilisant la phrase TYPE OF) ou une référence à un type de colonne de table (en utilisant la phrase TYPE OF COLUMN).

Fonctions déterministes

La clause facultative DETERMINISTIC indique que la fonction est déterministe. Les fonctions déterministes renvoient le même résultat à chaque fois si on leur donne le même ensemble de valeurs d’entrée. Les fonctions non déterministes peuvent renvoyer des résultats différents à chaque fois, même si on leur donne le même ensemble de valeurs d’entrée. Si une fonction est dite déterministe, elle n’est pas recalculée si elle a déjà été calculée une fois avec l’ensemble donné d’arguments d’entrée, mais elle prend ses valeurs du cache

Note

En fait, dans la version actuelle de Firebird, il n’y a pas de cache de fonctions stockées avec des arguments d’entrée mis en correspondance avec des valeurs de sortie.

Spécifier une instruction DETERMINISTIC est en fait une sorte de promesse que le code de la fonction retournera la même chose. A ce stade, une fonction déterministe est considérée comme un invariant et fonctionne sur les mêmes principes que les autres invariants. C’est-à-dire qu’elle est calculée et mise en cache au niveau d’exécution actuel de cette requête.

Cet exemple le démontre aisément :

CREATE FUNCTION FN_T
RETURNS DOUBLE PRECISION DETERMINISTIC
AS
BEGIN
  RETURN rand();
END

-- la fonction sera calculée deux fois et retournera 2 valeurs différentes
SELECT fn_t() FROM rdb$database
UNION ALL
SELECT fn_t() FROM rdb$database

-- la fonction sera calculée une fois et retournera 2 valeurs identiques
WITH t(n) AS (
  SELECT 1 FROM rdb$database
  UNION ALL
  SELECT 2 FROM rdb$database
)
SELECT n, fn_t() FROM t

docnext count = 14

Privilèges d’exécution

La clause facultative SQL SECURITY vous permet de spécifier avec quels privilèges la fonction stockée est exécutée. Si l’option INVOKER est sélectionnée, la fonction stockée est exécutée avec les privilèges de l’utilisateur appelant. Si l’option DEFINER est sélectionnée, la fonction stockée est exécutée avec les privilèges de l’utilisateur définissant (propriétaire de la fonction). Ces privilèges s’ajouteront aux privilèges accordés à la fonction stockée elle-même à l’aide de l’opérateur GRANT. Par défaut, la fonction stockée est exécutée avec les privilèges de l’utilisateur appelant.

Tip

Les privilèges d’exécution par défaut pour les objets de métadonnées nouvellement créés peuvent être modifiés à l’aide de la commande

ALTER DATABASE SET DEFAULT SQL SECURITY {DEFINER | INVOKER}

Le corps de la fonction stockée

Le mot clé "AS" est suivi du corps de la fonction stockée.

Déclaration des variables locales, des curseurs et des sous-routines

La section optionnelle <déclarations> décrit les variables locales des fonctions, les curseurs nommés et les sous-programmes (sous-procédures et sous-fonctions). Les variables locales sont soumises aux mêmes règles que les paramètres des fonctions d’entrée en ce qui concerne la spécification du type de données. Pour plus de détails, voir "Langage procédural PSQL" dans les sections DECLARE VARIABLE etDECLARE CURSOR,DECLARE PROCEDURE,DECLARE FUNCTION.

Une section de déclaration facultative est nécessairement suivie d’une instruction composée. Une instruction composée consiste en une ou plusieurs instructions PSQL comprises entre les mots-clés BEGIN et END. Une instruction composée peut contenir une ou plusieurs autres instructions composées. L’imbrication est limitée à 512 niveaux. Toute instruction BEGIN …​ END peuvent être vides, y compris le bloc principal.

Fonctions externes

Une fonction stockée peut être située dans un module externe. Dans ce cas, au lieu du corps de la fonction, l’emplacement de la fonction dans le module externe est spécifié en utilisant la phrase EXTERNAL NAME. L’argument de cette phrase est une chaîne de caractères avec le nom du module externe, le nom de la fonction dans le module et des informations définies par l’utilisateur séparées par un séparateur. La phrase ENGINE spécifie le nom du plug-in pour gérer les modules externes. Dans Firebird, le plug-in pour gérer les modules externes est UDR. Après le mot clé AS, une chaîne de caractères peut être spécifiée

Warning

Les fonctions externes déclarées comme DECLARE EXTERNAL FUNCTION, également connues sous le nom d’UDF, ne doivent pas être confondues avec les fonctions situées dans les modules externes déclarés comme CREATE FUNCTION …​ EXTERNAL NAME, appelé UDR (User Defined Routine). Les premières sont un héritage des versions précédentes de Firebird, avec des capacités nettement inférieures au nouveau type de fonctions externes. Dans Firebird 4.0, les UDF sont déclarées obsolètes.

ALTER FUNCTION

affectation

Modifier une fonction stockée existante.

Disponible en

DSQL

Syntaxe
ALTER FUNCTION funcname
[(<inparam> [, <inparam> ...])]
RETURNS <type> [COLLATE collation]
[DETERMINISTIC]
<routine-body>

Pour plus d'informations, voir. CREATE FUNCTION.

L’instruction ALTER FUNCTION permet de modifier la composition et les caractéristiques des paramètres d’entrée, le type de valeur de sortie, les variables locales, les curseurs nommés, les sous-programmes et le corps de la fonction stockée. Pour les fonctions externes (UDR), vous pouvez modifier le point d’entrée et le nom du moteur. Les fonctions externes déclarées comme DECLARE EXTERNAL FUNCTION, également connues sous le nom d’UDF, ne peuvent pas être converties en fonctions PSQL et vice versa. Une fois exécutées, les privilèges et dépendances existants sont conservés.

Note

Soyez prudent lorsque vous modifiez le nombre et les types de paramètres d’entrée des fonctions stockées. Le code d’application existant peut devenir inapplicable car le format d’appel de la fonction est incompatible avec la nouvelle description des paramètres. De plus, les modules PSQL utilisant la fonction stockée modifiée peuvent devenir invalides. Des informations sur la façon de détecter cela peuvent être trouvées dans Field RDB$VALID_BLR.

Warning

Si vous avez déjà une fonction externe de style Legacy (DECLARE EXTERNAL FUNCTION), l’instruction ALTER FUNCTION la transformera en fonction normale sans aucun avertissement. Ceci a été fait intentionnellement pour faciliter la migration vers le nouveau style d’écriture des fonctions externes connu sous le nom d’UDR.

Qui peut modifier une fonction ?

L’instruction ALTER FUNCTION peut être exécutée :

  • Administrateurs

  • Le propriétaire de la fonction stockée ;

  • Les utilisateurs ayant le privilège ALTER ANY FUNCTION.

Exemples

Example 1. Modification d’une fonction stockée
ALTER FUNCTION ADD_INT(A INT, B INT, C INT)
RETURNS INT
AS
BEGIN
  RETURN A+B+C;
END

CREATE OR ALTER FUNCTION

affectation

Créez une nouvelle fonction stockée ou modifiez une fonction stockée existante.

Disponible en

DSQL

Syntaxe
CREATE OR ALTER FUNCTION funcname
[(<inparam> [, <inparam> ...])]
RETURNS <type> [COLLATE collation]
[DETERMINISTIC]
<routine-body>

Pour plus d'informations, voir. CREATE FUNCTION.

L’instruction CREATE OR ALTER FUNCTION crée une nouvelle fonction stockée ou modifie une fonction stockée existante. Si la fonction stockée n’existe pas, elle sera créée à l’aide de l’instruction CREATE FUNCTION. Si elle existe déjà, elle sera modifiée et recompilée, tout en préservant les privilèges et dépendances existants.

Warning

Si vous avez déjà une fonction externe de style Legacy (DECLARE EXTERNAL FUNCTION), l’instruction CREATE OR ALTER FUNCTION la transformera en fonction normale sans aucun avertissement. Ceci a été fait intentionnellement pour faciliter la migration vers le nouveau style d’écriture des fonctions externes connu sous le nom d’UDR.

Exemples

Example 1. Créer une nouvelle fonction stockée ou modifier une fonction stockée existante
CREATE OR ALTER FUNCTION ADD_INT(A INT, B INT DEFAULT 0)
RETURNS INT
AS
BEGIN
  RETURN A+B;
END

DROP FUNCTION

affectation

Suppression d’une fonction stockée.

Disponible en

DSQL

Syntaxe
DROP FUNCTION funcname
Table 1. Paramètres de la fonction`DROP FUNCTION`
Paramètre Description

funcname

Le nom de la fonction stockée.

L’instruction DROP FUNCTION supprime une fonction stockée existante. S’il y a des dépendances sur une fonction stockée, une erreur sera générée lorsque vous essayez de supprimer une telle fonction.

Qui peut supprimer une fonction ?

L’instruction DROP FUNCTION peut être exécutée :

  • Administrateurs

  • Le propriétaire de la fonction stockée ;

  • Les utilisateurs ayant le privilège DROP ANY FUNCTION.

Exemples

Example 1. Suppression d’une fonction stockée
DROP FUNCTION ADD_INT;
Voir aussi :

CREATE FUNCTION.

RECREATE FUNCTION

affectation

Créez une nouvelle fonction stockée ou recréez une fonction stockée existante.

Disponible en

DSQL

Syntaxe
RECREATE FUNCTION funcname
[(<inparam> [, <inparam> ...])]
RETURNS <type> [COLLATE collation]
[DETERMINISTIC]
<routine-body>

Pour plus d'informations, voir. CREATE FUNCTION

L’instruction RECREATE FUNCTION crée une nouvelle fonction stockée ou recrée une fonction existante. Si une fonction portant ce nom existe déjà, l’instruction tentera de la supprimer et de créer une nouvelle fonction. L’opération échouera lors de la confirmation de la transaction si la fonction a des dépendances.

Note

Notez que les erreurs de dépendance ne sont pas détectées avant la phase de confirmation de la transaction.

Après la recréation d’une fonction, les privilèges d’exécution de la fonction stockée et les privilèges de la fonction stockée elle-même ne sont pas conservés.

Exemples

Example 1. Création ou recréation d’une fonction stockée
RECREATE FUNCTION ADD_INT(A INT, B INT DEFAULT 0)
RETURNS INT
AS
BEGIN
  RETURN A+B;
END