FirebirdSQL logo

EXECUTE STATEMENT

Destination

Exécution d’instructions SQL générées dynamiquement.

Disponible en

PSQL

Syntaxe
<execute_statement> ::=
  EXECUTE STATEMENT <argument>
    [<option> ...]
    [INTO <variables>]

<argument> ::=
    <paramless_stmt>
  | (<paramless_stmt>)
  | (<stmt_with_params>) (<param_values>)

<param_values> ::= <named_values> | <positional_values>

<named_values> ::=
  [EXCESS] paramname := <value_expr>
  [, [EXCESS] paramname := <value_expr> ...]

<positional_values> ::= <value_expr> [, <value_expr> ...]

<option> ::=
    WITH {AUTONOMOUS | COMMON} TRANSACTION
  | WITH CALLER PRIVILEGES
  | AS USER user
  | PASSWORD password
  | ROLE role
  | ON EXTERNAL [DATA SOURCE] <connect_string>

<connection_string> ::=
  Voir. <filespec> = Syntaxe CREATE DATABASE !!

<variables> ::= [:]varname [, [:]varname ...]
Table 1. Paramètres de l’instruction EXECUTE STATEMENT
Paramètre Description

paramless_stmt

Une chaîne littérale ou une variable contenant une requête SQL non paramétrée.

stmt_with_params

Une chaîne littérale ou une variable contenant une requête SQL paramétrée.

paramname

Le nom du paramètre de la requête SQL.

value_expr

Une expression pour obtenir la valeur d’un paramètre de la requête.

user

Nom de l’utilisateur. Peut être une chaîne, CURRENT_USER ou une variable.

password

Mot de passe. Peut être une chaîne ou une variable.

role

Rôle. Peut être une chaîne, `CURRENT_ROLE' ou une variable.

connection_string

Chaîne de connexion à la base de données distante Peut être une chaîne ou une variable.

varname

Variable.

L’instruction EXECUTE STATEMENT prend un paramètre de type chaîne et l’exécute comme s’il s’agissait d’une instruction DSQL. Si l’instruction renvoie des données, celles-ci peuvent être passées à des variables locales à l’aide de l’instruction INTO.

Instructions paramétrés

Vous pouvez utiliser des paramètres dans une instruction DSQL. Les paramètres peuvent être nommés ou positionnels (sans nom). Une valeur doit être attribuée à chaque paramètre.

Caractéristiques des Instructions paramétrés
  1. L’utilisation simultanée des paramètres named et position dans la même requête est interdite ;

  2. Si une déclaration a des paramètres, ils doivent être placés entre parenthèses lorsque EXECUTE STATEMENT est appelé, quelle que soit la façon dont ils sont présentés : directement comme une chaîne de caractères, comme un nom de variable ou comme une expression ;

  3. Les paramètres nommés doivent être précédés de deux points (‘:’) dans la déclaration elle-même, mais pas lors de l’attribution d’une valeur au paramètre ;

  4. Le passage des valeurs aux paramètres non nommés doit se faire dans le même ordre que celui dans lequel ils apparaissent dans le texte de la requête ;

  5. L’affectation des valeurs des paramètres doit être effectuée à l’aide d’un Instruction spécial “:=”, similaire à l’Instruction d’affectation du Pascal ;

  6. Chaque paramètre nommé peut être utilisé plusieurs fois dans l’Instruction, mais une seule fois lors de l’attribution d’une valeur ;

  7. Pour les paramètres positionnels, le nombre de valeurs à substituer doit être exactement égal au nombre de paramètres (points d’interrogation) dans l’Instruction ;

  8. Le mot-clé facultatif EXCESS indique que ce paramètre nommé ne doit pas nécessairement être mentionné dans le texte de la requête. Notez que tous les paramètres non EXCESS doivent être présents dans la requête.

Exemples EXECUTE STATEMENT configuré
Example 1. Utilisation EXECUTE STATEMENT avec des paramètres nommés :
...
DECLARE license_num VARCHAR(15);
DECLARE connect_string VARCHAR (100);
DECLARE stmt VARCHAR (100) =
  'SELECT license
   FROM cars
   WHERE driver = :driver AND location = :loc';
BEGIN
  ...
  SELECT connstr
  FROM databases
  WHERE cust_id = :id
  INTO connect_string;
  ...
  FOR
    SELECT id
    FROM drivers
    INTO current_driver
   DO
   BEGIN
     FOR
       SELECT location
       FROM driver_locations
       WHERE driver_id = :current_driver
       INTO current_location
     DO
     BEGIN
       ...
       EXECUTE STATEMENT (stmt)
       (driver := current_driver,
        loc := current_location)
       ON EXTERNAL connect_string
       INTO license_num;
       ...
Example 2. Utilisation de EXECUTE STATEMENT avec des paramètres de position :
DECLARE license_num VARCHAR (15);
DECLARE connect_string VARCHAR (100);
DECLARE stmt VARCHAR (100) =
  'SELECT license
   FROM cars
   WHERE driver = ? AND location = ?';
BEGIN
  ...
  SELECT connstr
  FROM databases
  WHERE cust_id = :id
  INTO connect_string;
  ...
  FOR SELECT id
      FROM drivers
      INTO current_driver
  DO
  BEGIN
    FOR
      SELECT location
      FROM driver_locations
      WHERE driver_id = :current_driver
      INTO current_location
    DO
    BEGIN
      ...
      EXECUTE STATEMENT (stmt)
      (current_driver, current_location)
      ON EXTERNAL connect_string
      INTO license_num;
      ...
Example 3. Utilisation de EXECUTE STATEMENT avec des paramètres redondants (EXCESS) :
CREATE PROCEDURE P_EXCESS (A_ID INT, A_TRAN INT = NULL, A_CONN INT = NULL)
  RETURNS (ID INT, TRAN INT, CONN INT)
AS
DECLARE S VARCHAR(255);
DECLARE W VARCHAR(255) = '';
BEGIN
  S = 'SELECT * FROM TTT WHERE ID = :ID';

  IF (A_TRAN IS NOT NULL)
  THEN W = W || ' AND TRAN = :a';

  IF (A_CONN IS NOT NULL)
  THEN W = W || ' AND CONN = :b';

  IF (W <> '')
  THEN S = S || W;

  -- pourrait soulever une erreur si TRAN ou CONN est nul
  -- FOR EXECUTE STATEMENT (:S) (a := :A_TRAN, b := A_CONN, id := A_ID)

  -- OK dans tous les cas
  FOR EXECUTE STATEMENT (:S) (EXCESS a := :A_TRAN, EXCESS b := A_CONN, id := A_ID)
      INTO :ID, :TRAN, :CONN
      DO SUSPEND;
END