Firebird Documentation IndexFirebird 2.5 SprachreferenzStatements der Data Manipulation Language (DML) → EXECUTE BLOCK
Firebird Home Firebird Home Zurück: EXECUTE PROCEDUREFirebird Documentation IndexNach oben: Statements der Data Manipulation Language (DML)Weiter: Prozedurale SQL-Anweisungen (PSQL)

EXECUTE BLOCK

Inhaltsverzeichnis

Eingabe- und Ausgabeparameter
Statement-Terminatoren

Verwendet für:  Erstellen eines „anonymen“ Blocks von PSQL-Code in DSQL zur sofortigen Ausführung

Verfügbar in: DSQL

Syntax: 

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

<inparams>         ::=  <param_decl> = ? [, <inparams> ]
<outparams>        ::=  <param_decl>     [, <outparams>]
<param_decl>       ::=  paramname <type> [NOT NULL] [COLLATE collation]
<type>             ::=  datatype | [TYPE OF] domain | TYPE OF COLUMN rel.col

datatype ::=
    {SMALLINT | INTEGER | BIGINT}
  | {FLOAT | DOUBLE PRECISION}
  | {DATE | TIME | TIMESTAMP}
  | {DECIMAL | NUMERIC} [(precision [, scale])]
  | {CHAR | CHARACTER | CHARACTER VARYING | VARCHAR} [(size)]
    [CHARACTER SET charset]
  | {NCHAR | NATIONAL CHARACTER | NATIONAL CHAR} [VARYING] [(size)]
  | BLOB [SUB_TYPE {subtype_num | subtype_name}]
    [SEGMENT SIZE seglen] [CHARACTER SET charset]
  | BLOB [(seglen [, subtype_num])]

<declarations>     ::=  declare_item [declare_item ...]
declare_item ::=  declare_var; | declare_cursor
          

Tabelle 6.17. Argument der EXECUTE BLOCK-Statement-Parameter

Argument Beschreibung
param_decl Name und Beschreibung eines Eingabe- oder Ausgabeparameters
declarations Ein Abschnitt zum Deklarieren von lokalen Variablen und benannten Cursorn
declare_var Lokale Variablendeklaration
declare_cursor Deklaration eines benannten Cursors
paramname Der Name eines Eingabe- oder Ausgabeparameters des prozeduralen Blocks mit bis zu 31 Zeichen. Der Name muss unter Ein- und Ausgabeparametern und lokalen Variablen im Block eindeutig sein
datatype SQL-Datentyp
collation Sortierreihenfolge
domain Domain
rel Name einer Tabelle oder Ansicht
col Name einer Spalte in einer Tabelle oder Sicht
precision Präzision. Von 1 bis 18
scale Rahmen. Von 0 bis 18. Es muss kleiner oder gleich precision sein
size Die maximale Größe einer Zeichenfolge in Zeichen
charset Zeichensatz
subtype_num BLOB-Subtypennummer
subtype_name mnemotechnischer Name des BLOB-Subtyps
seglen Segmentgröße, kann nicht größer als 65.535 sein


Beschreibung: Führt einen PSQL-Block aus, als wäre es eine gespeicherte Prozedur, optional mit Eingabe- und Ausgabeparametern und Variablendeklarationen. Dies ermöglicht dem Benutzer „on-the-fly“ PSQL innerhalb eines DSQL-Kontexts auszuführen.

Beispiele: 

          

In diesem Beispiel werden die Zahlen 0 bis 127 und die entsprechenden ASCII-Zeichen in die Tabelle ASCIITABLE eingefügt:

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

Das nächste Beispiel berechnet das geometrische Mittel zweier Zahlen und gibt es an den Benutzer zurück:

EXECUTE BLOCK (x DOUBLE PRECISION = ?, y DOUBLE PRECISION = ?)
RETURNS (gmean DOUBLE PRECISION)
AS
BEGIN
  gmean = SQRT(x*y);
  SUSPEND;
END
          

Da dieser Block Eingabeparameter hat, muss er zuerst vorbereitet werden. Dann können die Parameter eingestellt und der Block ausgeführt werden. Es hängt von der Client-Software ab, wie dies durchgeführt werden muss. Auch wenn dies möglich ist—beachten Sie die folgenden Hinweise.

Unser letztes Beispiel nimmt zwei ganzzahlige Werte, smallest und largest. Für alle Zahlen im Bereich smallest ... largest gibt der Block die Zahl selbst, sein Quadrat, seine dritte und seine vierte Potenz aus.

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
          

Auch hier hängt es von der Client-Software ab, ob und wie Sie die Parameterwerte einstellen können.

Eingabe- und Ausgabeparameter

Das Ausführen eines Blocks ohne Eingabeparameter sollte mit jedem Firebird-Client möglich sein, der es dem Benutzer erlaubt, seine eigenen DSQL-Anweisungen einzugeben. Wenn es Eingabeparameter gibt, werden die Dinge komplizierter: Diese Parameter müssen ihre Werte erhalten, nachdem die Anweisung vorbereitet wurde, aber bevor sie ausgeführt wird. Dies erfordert spezielle Voraussetzungen, die nicht jede Client-Anwendung bietet. (Firebirds eigenes isql, zum Beispiel, nicht.)

Der Server akzeptiert nur Fragezeichen („?“) als Platzhalter für die Eingabewerte, also nicht „:a“, „:MyParam“ etc., oder Literalwerte. Client-Software unterstützt möglicherweise die Form „:xxx“ und wandelt es vor dem Senden an den Server um.

Wenn der Block Ausgabeparameter hat, müssen Sie SUSPEND verwenden, sonst wird nichts zurückgegeben.

Die Ausgabe erfolgt immer in Form einer Ergebnismenge, genau wie bei einer Anweisung mit SELECT. Sie können weder RETURNING_VALUES verwenden noch einen Block mit INTO in Variablen anwenden, auch wenn es nur eine Ergebniszeile gibt.

Statement-Terminatoren

Einige SQL-Statement-Editoren—insbesondere das isql-Dienstprogramm, das mit Firebird geliefert wird, und möglicherweise einige Editoren von Drittanbietern—verwenden eine interne Konvention, die erfordert, dass alle Anweisungen mit einem Semikolon abgeschlossen werden. Dies erzeugt einen Konflikt mit der PSQL-Syntax beim Codieren in diesen Umgebungen. Wenn Sie mit diesem Problem und seiner Lösung nicht vertraut sind, lesen Sie die Details im Kapitel PSQL im Abschnitt Umschalten des Terminators in isql.

Zurück: EXECUTE PROCEDUREFirebird Documentation IndexNach oben: Statements der Data Manipulation Language (DML)Weiter: Prozedurale SQL-Anweisungen (PSQL)
Firebird Documentation IndexFirebird 2.5 SprachreferenzStatements der Data Manipulation Language (DML) → EXECUTE BLOCK