Beispiele mit FOR SELECT
-
Eine einfache Schleife durch die Abfrageergebnisse:
CREATE PROCEDURE SHOWNUMS RETURNS ( AA INTEGER, BB INTEGER, SM INTEGER, DF INTEGER) AS BEGIN FOR SELECT DISTINCT A, B FROM NUMBERS ORDER BY A, B INTO AA, BB DO BEGIN SM = AA + BB; DF = AA - BB; SUSPEND; END END
-
Verschachtelte
FOR SELECT
-Schleife:CREATE PROCEDURE RELFIELDS RETURNS ( RELATION CHAR(32), POS INTEGER, FIELD CHAR(32)) AS BEGIN FOR SELECT RDB$RELATION_NAME FROM RDB$RELATIONS ORDER BY 1 INTO :RELATION DO BEGIN FOR SELECT RDB$FIELD_POSITION + 1, RDB$FIELD_NAME FROM RDB$RELATION_FIELDS WHERE RDB$RELATION_NAME = :RELATION ORDER BY RDB$FIELD_POSITION INTO :POS, :FIELD DO BEGIN IF (POS = 2) THEN RELATION = ' "'; SUSPEND; END END END
-
Verwenden Sie die
AS CURSOR
-Klausel, um einen Cursor für das positionierte Löschen eines Datensatzes zu verwenden:CREATE PROCEDURE DELTOWN ( TOWNTODELETE VARCHAR(24)) RETURNS ( TOWN VARCHAR(24), POP INTEGER) AS BEGIN FOR SELECT TOWN, POP FROM TOWNS INTO :TOWN, :POP AS CURSOR TCUR DO BEGIN IF (:TOWN = :TOWNTODELETE) THEN -- Positional delete DELETE FROM TOWNS WHERE CURRENT OF TCUR; ELSE SUSPEND; END END
-
Verwenden eines implizit deklarierten Cursors als Cursorvariable
EXECUTE BLOCK RETURNS (o CHAR(63)) AS BEGIN FOR SELECT rdb$relation_name AS name FROM rdb$relations AS CURSOR c DO BEGIN o = c.name; SUSPEND; END END
-
Cursorvariablen in Abfragen eindeutig machen
EXECUTE BLOCK RETURNS (o1 CHAR(63), o2 CHAR(63)) AS BEGIN FOR SELECT rdb$relation_name FROM rdb$relations WHERE rdb$relation_name = 'RDB$RELATIONS' AS CURSOR c DO BEGIN FOR SELECT -- with a prefix resolves as a cursor :c.rdb$relation_name x1, -- no prefix as an alias for the rdb$relations table c.rdb$relation_name x2 FROM rdb$relations c WHERE rdb$relation_name = 'RDB$DATABASE' AS CURSOR d DO BEGIN o1 = d.x1; o2 = d.x2; SUSPEND; END END END