Firebird: Row Counter

3. Datensatzanzahl auslesen

Die Abfrage der Datansatzanzahl geschieht dann über die Abfrage des zugehörigen Generators. Wichtig ist dabei, als Änderungswert 0 an GEN_ID zu übergeben, um den Generatorwert nicht zu ändern. Hier die Abfrage für alle drei Tabellen in der Beispieldatenbank als SELECT:
/* Datensatzanzahl TABLE1*/
SELECT GEN_ID("gen_TABLE1", 0) FROM RDB$DATABASE;

/* Datensatzanzahl TABLE2*/
SELECT GEN_ID("gen_TABLE2", 0) FROM RDB$DATABASE;

/* Datensatzanzahl TABLE3*/
SELECT GEN_ID("gen_TABLE3", 0) FROM RDB$DATABASE;

In einer STORED PROCEDURE oder einem EXECUTE BLOCK Statement wird der Rückgabewert z.B. einer Variable übergeben:
EXECUTE BLOCK
AS
DECLARE VARIABLE ROWS1 TYPE OF "dom_INT64";
DECLARE VARIABLE ROWS2 TYPE OF "dom_INT64";
DECLARE VARIABLE ROWS3 TYPE OF "dom_INT64";
BEGIN

  /* Datensatzanzahl TABLE1 */
  ROWS1 = GEN_ID("gen_TABLE1", 0);

  /* Datensatzanzahl TABLE2 */
  ROWS2 = GEN_ID("gen_TABLE3", 0);

  /* Datensatzanzahl TABLE3 */
  ROWS3 = GEN_ID("gen_TABLE3", 0);

END

Datensätze mit Aktiv-Flag auslesen

Die Abfrage für das Aktiv-Flag = 1 funktioniert natürlich genau so wie die Abfrage der Gesamtanzahl. Allerdings will man auch wissen, wieviel Datensätze Das Aktiv-Flag = 0 besitzen. Dazu wird die Anzahl der aktiven Datensätze von der Gesamtanzahl abgezogen:
/* Datensatzanzahl TABLE1*/
SELECT GEN_ID("gen_TABLE3"      , 0)                                 AS "gesamt" ,
       GEN_ID("gen_TABLE3ACTIVE", 0)                                 AS "aktiv"  ,
       GEN_ID("gen_TABLE3"      , 0) - GEN_ID("gen_TABLE3ACTIVE", 0) AS "inaktiv"
  FROM RDB$DATABASE;

Datensätze in der temporären Tabelle beachten

Hat man innerhalb einer Transaktion bereits Datensätze hinzugefügt, gelöscht oder das Aktiv-Flag geändert gehen diese Änderungen noch nicht in die Datensatzanzahl ein. Bei Bedarf kann man diese Daten bei der Abfrage zur Berechnung hinzuziehen. In ROW_TEMP_SUMS werden die temporären Werte für die beiden Generatoren aufsummiert und im äßeren SELECT zu den im inneren SELECT gelesenen Generatorwerten addiert:
SELECT "gen_TABLE3_Val"       + "rcn_count_all"    AS "gesamt" ,
       "gen_TABLE3ACTIVE_Val" + "rcn_count_active" AS "aktiv"  ,
       "gen_TABLE3_Val"       + "rcn_count_all"    -
       "gen_TABLE3ACTIVE_Val" - "rcn_count_active" AS "inaktiv"
FROM
(
  WITH
    ROW_TEMP_SUMS AS
    (
        SELECT SUM("rcn_count") AS "rcn_count",
               "rcn_generator"  AS "rcn_gen"
          FROM "_TABLE_ROW_COUNT"
         WHERE "rcn_generator" = '"gen_TABLE3"'
            OR "rcn_generator" = '"gen_TABLE3ACTIVE"'
      GROUP BY "rcn_generator"
    )
     SELECT GEN_ID  ("gen_TABLE3"           , 0) AS "gen_TABLE3_Val"      ,
            GEN_ID  ("gen_TABLE3ACTIVE"     , 0) AS "gen_TABLE3ACTIVE_Val",
            COALESCE(sumall   ."rcn_count"  , 0) AS "rcn_count_all"       ,
            COALESCE(sumactive."rcn_count"  , 0) AS "rcn_count_active"
       FROM RDB$DATABASE
  LEFT JOIN ROW_TEMP_SUMS sumall    ON sumall   ."rcn_gen" = '"gen_TABLE3"'
  LEFT JOIN ROW_TEMP_SUMS sumactive ON sumactive."rcn_gen" = '"gen_TABLE3ACTIVE"'
)