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"'
)