EXECUTE BLOCK

<< DELETE | FB 2.0 Language Reference | EXECUTE PROCEDURE >>

EXECUTE BLOCK

Available in: DSQL

Added in: 2.0

Description

Executes a block of PSQL code as if it were a stored procedure, optionally with input and output parameters and variable declarations. This allows the user to perform "on the fly" PSQL within a DSQL context.

Syntax

 EXECUTE BLOCK [(<inparams>)]
      [RETURNS (<outparams>)]
 AS
    [<declarations>]
 BEGIN
    [<PSQL statements>]
 END

 <inparams>      ::= paramname type = ? [, <inparams>]
 <outparams>     ::= paramname type [, <outparams>]
 <declarations>  ::= See PSQL::DECLARE for the exact syntax

Examples

This example injects the numbers 0 through 127 and their corresponding ASCII characters into the table ASCIITABLE:

 execute block
 as
 declare i int = 0;
 begin
    while (i < 128) do
    begin
       insert into AsciiTable values (:i, ascii_char(:i));
       i = i + 1;
    end
 end

The next example calculates the geometric mean of two numbers and returns it to the user:

 execute block (x double precision = ?, y double precision = ?)
 returns (gmean double precision)
 as
 begin
    gmean = sqrt(x*y);
    suspend;
 end

Because this block has input parameters, it has to be prepared first. Then the parameters can be set and the block executed. It depends on the client software how this must be done and even if it is possible at all – see the notes below.

Our last example takes two integer values, smallest and largest. For all the numbers in the range smallest .. largest, the block outputs the number itself, its square, its cube and its fourth power.

 execute block (smallest int = ?, largest int = ?)
 returns (number int, square bigint, cube bigint, fourth bigint)
 as
 begin
    number = smallest;
    while (number <= largest) do
    begin
       square = number * number;
       cube = number * square;
       fourth = number * cube;
       suspend;
       number = number + 1;
    end
 end

Again, it depends on the client software if and how you can set the parameter values.

Notes

  • Some clients, especially those allowing the user to submit several statements at once, may require you to surround the EXECUTE BLOCK statement with SET TERM lines, like this:
      set term #;
      execute block (...)
      as
      begin
         statement1;
         statement2;
      end
      #
      set term ;#
In Firebird's isql client you must set the terminator to something other than ";" before you type in the EXECUTE BLOCK statement. Otherwise isql, being line-oriented, will try to execute the part you have entered as soon as it encounters the first semicolon.
  • Executing a block without input parameters should be possible with every Firebird client that allows the user to enter his or her own DSQL statements. If there are input parameters, things get trickier: these parameters must get their values after the statement is prepared but before it is executed. This requires special provisions, which not every client application offers. (Firebird's own isql, for one, doesn't.)
  • The server only accepts question marks ("?") as placeholders for the input values, not ":a", ":MyParam" etc., or literal values. Client software may support the ":xxx" form though, which it will preprocess before sending it to the server.
  • If the block has output parameters, you must use SUSPEND or nothing will be returned.
  • Output is always returned in the form of a result set, just as with a SELECT statement. You can't use RETURNING_VALUES or execute the block INTO some variables, even if there's only one result row.

back to top of page
<< DELETE | FB 2.0 Language Reference | EXECUTE PROCEDURE >>