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

WITH {AUTONOMOUS | COMMON} TRANSACTION

Par défaut, l’instruction est exécutée dans le contexte de la transaction courante. En utilisant la clause WITH AUTONOMOUS TRANSACTION, une nouvelle transaction sera lancée avec les mêmes paramètres que la transaction courante. Elle sera acquittée si l’instruction est exécutée sans erreur et annulée (roll back) sinon.Avec la clause WITH COMMON TRANSACTION , la transaction courante est utilisée dans la mesure du possible.

Si l’instruction doit être exécutée dans une connexion distincte, la transaction déjà en cours d’exécution dans cette connexion est utilisée (le cas échéant). Sinon, une nouvelle transaction est lancée avec les paramètres de la transaction courante. Toute nouvelle transaction lancée en mode COMMON est confirmée ou annulée en même temps que la transaction courante.

WITH CALLER PRIVILEGES

Par défaut, les instructions SQL sont exécutées avec les privilèges de l’utilisateur courant. La spécification WITH CALLER PRIVILILEGES leur ajoute des privilèges pour appeler une procédure stockée ou un déclencheur, tout comme si l’instruction était exécutée directement par un sous-programme. WITH CALLER PRIVILEGES n’a aucun effet si la clause ON EXTERNAL est également présente.

ON EXTERNAL [DATA SOURCE]

Avec la clause ON EXTERNAL DATA SOURCE, l’instruction est exécutée dans une connexion séparée à la même base de données ou à une autre, éventuellement sur un serveur différent. Si la chaîne de connexion est définie à NULL ou '' (chaîne vide), la clause ON EXTERNAL est considérée comme manquante et l’instruction est exécutée pour la base de données actuelle. La chaîne de connexion est détaillée dans l’instruction CREATE DATABASE.Voir. Création d’une base de données sur un serveur distant.

Le pool de connexion et le pool de transaction sont utilisés lors de l’exécution d’une instruction dans une connexion séparée.