FirebirdSQL logo

CREATE PACKAGE BODY

affectation

Création du corps du paquet.

Disponible en

DSQL

Syntaxe
CREATE PACKAGE BODY package_name
AS
BEGIN
  [<package_item> ...]
  [<package_body_item> ...]
END

<package_item> ::=
    <function_decl>;
  | <procedure_decl>;

<function_decl> ::=
  FUNCTION func_name [(<in_params>)]
  RETURNS <type> [NOT NULL] [COLLATE collation]
  [DETERMINISTIC]

<procedure_decl> ::=
  PROCEDURE proc_name [(<in_params>)]
  [RETURNS (<out_params>)]

<package_body_item> ::=
    <function_impl>
  | <procedure_impl>

<function_impl> ::=
  FUNCTION func_name [(<in_impl_params>)]
  RETURNS <type> [NOT NULL] [COLLATE collation]
  [DETERMINISTIC]
  <routine-body>

<procedure_impl> ::=
  PROCEDURE proc_name [(<in_impl_params>)]
  [RETURNS (<out_params>)]
  <routine-body>

<in_params> ::= <inparam> [, <inparam> ...]

<inparam> ::= <param_decl> [{= | DEFAULT} <value>]

<in_impl_params> ::= <param_decl> [, <param_decl> ...]

<value> ::=  {literal | NULL | context_var}

<out_params> ::= <outparam> [, <outparam> ...]

<outparam>  ::=  <param_decl>

<param_decl> ::= paramname <type> [NOT NULL] [COLLATE collation]

<type> ::= <datatype> | [TYPE OF] domain_name | TYPE OF COLUMN rel.col

<datatype> ::=
    <scalar_datatype> | <blob_datatype>

<scalar_datatype> ::= Voir Syntaxe des types de données scalaires.

<blob_datatype> ::= Voir Syntaxe du type de données BLOB.

<routine-body> ::=
    <psql-routine-body>
  | <external-routine-spec>

<psql-module-body> ::=
  Voir. Syntaxe du corps du module

<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 de la fonction CREATE PACKAGE BODY
Paramètre Description

package_name

Le nom du paquet, qui peut comporter jusqu’à 63 caractères.

function_decl

Déclaration de fonction.

procedure_decl

Déclaration de la procédure.

function_impl

Mise en œuvre de la fonction.

procedure_impl

Mise en œuvre de la procédure.

proc_name

Nom de la procédure, pouvant contenir jusqu’à 63 caractères.

func_name

Nom de la fonction. Peut contenir jusqu’à 63 caractères.

inparam

Description du paramètre d’entrée.

outparam

Description du paramètre de sortie.

subfunc_impl

Mise en œuvre d’un sous-programme de fonctions.

subproc_impl

Mise en œuvre d’une sous-procédure.

module-name

Le nom du module externe dans lequel se trouve la procédure/fonction.

routine-name

Nom interne d’une procédure/fonction dans un module externe.

misc-info

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

extbody

Le corps d’une procédure ou d’une fonction externe. Une chaîne littérale qui peut être utilisée par l’UDR à diverses fins.

engine

Nom du moteur pour l’utilisation des fonctions externes. Habituellement, le nom de l’UDR est donné.

literal

Un littéral dont le type est compatible avec le paramètre.

context_var

Toute variable contextuelle dont le type est compatible avec celui du paramètre.

paramname

Nom du paramètre d’entrée ou de sortie de la procédure/fonction. Peut contenir jusqu’à 63 caractères. Le nom du paramètre doit être unique parmi les paramètres d’entrée et de sortie de la procédure/fonction, ainsi que ses variables locales.

datatype

Type de données SQL.

collation

Ordre de tri.

domain_name

Nom de domaine.

rel

Le nom d’une table ou d’une vue.

col

Le nom de la colonne de la table ou de la vue.

L’instruction CREATE PACKAGE BODY crée un nouveau corps de paquetage. Le corps de paquetage ne peut être créé qu’après que l’en-tête de paquetage ait été créé. Si un en-tête de paquetage nommé nom_du_paquetage n’existe pas, une erreur appropriée sera émise.

Toutes les procédures et fonctions déclarées dans l’en-tête du paquet doivent être implémentées dans le corps du paquet. De plus, toutes les procédures et fonctions déclarées dans le corps du paquet doivent également être implémentées. Les procédures et fonctions définies dans le corps du paquet, mais non déclarées dans l’en-tête du paquet, ne sont pas visibles en dehors du corps du paquet.

Les noms des procédures et des fonctions déclarées dans le corps du paquet doivent être uniques parmi les noms des procédures et des fonctions déclarées dans l’en-tête et le corps du paquet.

Note

Il est préférable que les noms des procédures stockées et des fonctions du paquetage ne se chevauchent pas avec les noms des procédures stockées et des fonctions de l’espace de noms global, bien que cela soit acceptable. Le fait est que vous ne pouvez actuellement pas appeler une fonction/procédure de l’espace de noms global à l’intérieur d’un paquetage si une fonction/procédure du même nom est déclarée dans le paquetage.

Règles:
  • Tous les sous-programmes doivent être implémentés dans le corps du paquet, avec la même signature que celle déclarée dans l’en-tête et au début du corps du paquet.

  • Les valeurs par défaut des paramètres de procédure qui sont spécifiés dans <package_item> ne peuvent pas être remplacées. Cela signifie qu’ils ne peuvent être dans <package_body_item> que pour les procédures privées qui n’ont pas été déclarées.

Note

Les déclarations UDF (fonction externe DECLARE) ne sont pas supportées dans les packages.

Qui peut créer un corps de paquet ?

L’instruction CREATE PACKAGE BODY peut être exécutée :

  • Administrateurs

  • Propriétaire du paquet ;

  • Utilisateurs avec le privilège ALTER ANY PACKAGE.

docnext count = 6

Exemples

Example 1. Création du corps du paquet
CREATE PACKAGE BODY APP_VAR
AS
BEGIN
  -- Renvoie la date de début de la période
  FUNCTION GET_DATEBEGIN() RETURNS DATE DETERMINISTIC
  AS
  BEGIN
    RETURN RDB$GET_CONTEXT('USER_SESSION', 'DATEBEGIN');
  END
  -- Renvoie la date de fin de période
  FUNCTION GET_DATEEND() RETURNS DATE DETERMINISTIC
  AS
  BEGIN
    RETURN RDB$GET_CONTEXT('USER_SESSION', 'DATEEND');
  END
  -- Définit la plage de dates de la période de travail
  PROCEDURE SET_DATERANGE(ADATEBEGIN DATE, ADATEEND DATE)
  AS
  BEGIN
    RDB$SET_CONTEXT('USER_SESSION', 'DATEBEGIN', ADATEBEGIN);
    RDB$SET_CONTEXT('USER_SESSION', 'DATEEND', ADATEEND);
  END
END

DROP PACKAGE BODY

affectation

Supprimer le corps du paquet.

Disponible en

DSQL

Syntaxe
DROP PACKAGE BODY package_name
Table 1. Paramètres de la fonction DROP PACKAGE BODY
Paramètre Description

package_name

Nom du paquet.

L’opérateur DROP PACKAGE BODY supprime le corps du paquet.

Qui peut supprimer le corps d’un paquet ?

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

  • Administrateurs

  • Propriétaire du paquet ;

  • Utilisateurs avec le privilège ALTER ANY PACKAGE.

Exemples

Example 1. Supprimer le corps du paquet
DROP PACKAGE BODY APP_VAR;

RECREATE PACKAGE BODY

affectation

Créer un nouveau corps de paquet ou recréer un corps de paquet existant.

Disponible en

DSQL

Syntaxe
RECREATE PACKAGE BODY package_name
AS
BEGIN
  [<package_item> ...]
  [<package_body_item> ...]
END

<package_item> ::=
    <function_decl>;
  | <procedure_decl>;

<function_decl> ::=
  FUNCTION func_name [(<in_params>)]
  RETURNS <type> [COLLATE collation]
  [<function_options>]

<procedure_decl> ::=
  PROCEDURE proc_name [(<in_params>)]
  [RETURNS (<out_params>)]
  [<procedure_options>]

<package_body_item> ::=
    <function_impl>
  | <procedure_impl>

<function_impl> ::=
  FUNCTION func_name [(<in_impl_params>)]
  RETURNS <type> [COLLATE collation]
  [DETERMINISTIC]
  <routine-body>

<procedure_impl> ::=
  PROCEDURE proc_name [(<in_impl_params>)]
  [RETURNS (<out_params>)]
  <routine-body>

Pour plus d'informations, voir. CREATE PACKAGE BODY.

L’instruction RECREATE PACKAGE BODY crée un nouveau corps de paquetage ou recrée un corps de paquetage existant. Si un corps de paquetage portant ce nom existe déjà, l’instruction tentera de le supprimer et de créer un nouveau corps de paquetage. Après la recréation du corps de paquetage, les privilèges des sous-routines du paquetage et les privilèges du paquetage lui-même sont conservés.

Exemples

Example 1. Recréer le corps du paquet
RECREATE PACKAGE BODY APP_VAR
AS
BEGIN
  -- Renvoie la date de début de la période
  FUNCTION GET_DATEBEGIN() RETURNS DATE DETERMINISTIC
  AS
  BEGIN
    RETURN RDB$GET_CONTEXT('USER_SESSION', 'DATEBEGIN');
  END
  -- Renvoie la date de fin de période
  FUNCTION GET_DATEEND() RETURNS DATE DETERMINISTIC
  AS
  BEGIN
    RETURN RDB$GET_CONTEXT('USER_SESSION', 'DATEEND');
  END
  -- Définit la plage de dates de la période de travail
  PROCEDURE SET_DATERANGE(ADATEBEGIN DATE, ADATEEND DATE)
  AS
  BEGIN
    RDB$SET_CONTEXT('USER_SESSION', 'DATEBEGIN', ADATEBEGIN);
    RDB$SET_CONTEXT('USER_SESSION', 'DATEEND', ADATEEND);
  END
END