Écrire le code du corps du module
Cette section examine en détail les constructions procédurales SQL et les Instructions disponibles dans le corps des procédures stockées, des déclencheurs et des blocs PSQL anonymes.
WITH {AUTONOMOUS | COMMON} TRANSACTION
Pool de connexion externe(External connection pool)
Caractéristiques des connexions externes
Caractéristiques du pool de transactions (Transaction pooling)
Cette section examine en détail les constructions procédurales SQL et les Instructions disponibles dans le corps des procédures stockées, des déclencheurs et des blocs PSQL anonymes.
:
’)Un marqueur deux-points (‘`:`’) est utilisé dans PSQL pour marquer une référence à une variable dans une instruction DML. Sinon, un marqueur deux-points est facultatif devant les noms de variables.
Ne jamais préfixer un deux-points pour les variables de contexte.
Attribution d’une valeur à une variable.
PSQL
varname = <value_expr>;
Paramètre | Description |
---|---|
varname |
Le nom d’une variable locale ou d’un paramètre de procédure (fonction). |
value_expr |
Une expression, une constante ou une variable dont le type de données est compatible avec varname. |
PSQL utilise le signe égal (‘`=`’) comme Instruction d’affectation. L’Instruction d’affectation définit la variable à gauche de l’Instruction à la valeur de l’expression SQL à droite. Une expression peut être n’importe quelle expression SQL valide. Elle peut contenir des littéraux, des noms de variables internes, des opérations arithmétiques, logiques et de chaînes de caractères, des appels à des fonctions intégrées et des fonctions définies par l’utilisateur.
CREATE PROCEDURE MYPROC (
a INTEGER,
b INTEGER,
name VARCHAR (30)
)
RETURNS (
c INTEGER,
str VARCHAR(100))
AS
BEGIN
-- nous attribuons une constante
c = 0;
str = '';
SUSPEND;
-- attribuer des valeurs aux expressions
c = a + b;
str = name || CAST(b AS VARCHAR(10));
SUSPEND;
-- assigne la valeur de l'expression
-- construite à l'aide de la requête
c = (SELECT 1 FROM rdb$database);
-- assigner une valeur à partir d'une variable contextuelle
str = CURRENT_USER;
SUSPEND;
END
LEAVE
Sortir du cycle.
PSQL
[label:] <loop_stmt> BEGIN ... LEAVE [label]; ... END <loop_stmt> ::= FOR <select_stmt> INTO <var_list> DO | FOR EXECUTE STATEMENT ... INTO <var_list> DO | WHILE (<condition>) DO
Paramètre | Description |
---|---|
label |
Étiquette. |
select_stmt |
Instruction SELECT. |
condition |
Une condition logique renvoyant VRAI, FAUX ou INCONNU. |
L’instruction LEAVE
termine immédiatement la boucle interne des instructions WHILE ou FOR. En utilisant le paramètre optionnel label, LEAVE
peut également quitter la boucle externe, c’est-à-dire la boucle marquée par `. Le code continue à s’exécuter à partir de la première instruction après le bloc de boucle terminé.
LEAVE
Dans cet exemple, la boucle est quittée lorsqu’une erreur d’insertion se produit dans la table NUMBERS
. Le code continuera son exécution à partir de l’instruction C = 0
.
...
WHILE (B < 10) DO
BEGIN
INSERT INTO NUMBERS(B)
VALUES (:B);
B = B + 1;
WHEN ANY DO
BEGIN
EXECUTE PROCEDURE LOG_ERROR (
CURRENT_TIMESTAMP,
'ERROR IN B LOOP');
LEAVE;
END
END
C = 0;
...
Dans cet exemple, l’Instruction LEAVE LOOPA
termine la boucle extérieure et LEAVE LOOPB
termine la boucle intérieure.
Remarque : Un simple Instruction LEAVE
serait également suffisant pour mettre fin à la boucle interne.
...
STMT1 = 'SELECT NAME FROM FARMS';
LOOPA:
FOR EXECUTE STATEMENT :STMT1
INTO :FARM DO
BEGIN
STMT2 = 'SELECT NAME ' || 'FROM ANIMALS WHERE FARM = ''';
LOOPB:
FOR EXECUTE STATEMENT :STMT2 || :FARM || ''''
INTO :ANIMAL DO
BEGIN
IF (ANIMAL = 'FLUFFY') THEN
LEAVE LOOPB;
ELSE IF (ANIMAL = FARM) THEN
LEAVE LOOPA;
ELSE
SUSPEND;
END
END
...