FirebirdSQL logo
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