View Full Version : SQL-Select Anzahl der Datensätze
JoergHamacher
24-06-04, 11:02
Hallo,
zunächst noch mal vielen Dank für die schnellen Antworten beim letzten Mal.
Jetzt zu meinem Problem: in einem Anzeigeprogramm lese ich per DECLARE CURSOR ... FOR SELECT... WHERE... ORDER BY Datensätze aus einer zeimlich großen Datei ein, die ich dann in einer Schleife per FETCH NEXT CFROM CURSOR INTO... weiter verarbeite. Nun müßte ich allerdings vor Beginn der Schleife wissen, wieviele Datensätze die SELECT-Anweisung denn tatsächlich ausgewählt hat. Meines Wissens geht das nur mit einer zuvor ausgeführten zusätzlichen SELECT COUNT(*)-Anweisung, was aber vermutlich auf die Performance des Programms drückt. Gibt es eine Möglichkeit, dies direkt in dem eigentlichen SELECT-Statement einzubauen, oder vielleicht eine andere elegante Lösung?
Vielen Dank im Voraus!
Jörg
Hallo,
Ich wundere mich immer wieder für was sich die Leute so interessieren; bei Rekord Löffel Exzess kriegt man das garnicht raus und das stört auch niemand, aber seis drum:
select count(*) ist normalerweise der Weg, den man gehen muss. Wenn dafür ein Index verwendet werden kann, sollte das auch fluppen. Aufpassen sollte man, dass man dabei nicht mit hohem Sperrlevel liest.
mfg
Dieter Bender
Hallo,
zunächst noch mal vielen Dank für die schnellen Antworten beim letzten Mal.
Jetzt zu meinem Problem: in einem Anzeigeprogramm lese ich per DECLARE CURSOR ... FOR SELECT... WHERE... ORDER BY Datensätze aus einer zeimlich großen Datei ein, die ich dann in einer Schleife per FETCH NEXT CFROM CURSOR INTO... weiter verarbeite. Nun müßte ich allerdings vor Beginn der Schleife wissen, wieviele Datensätze die SELECT-Anweisung denn tatsächlich ausgewählt hat. Meines Wissens geht das nur mit einer zuvor ausgeführten zusätzlichen SELECT COUNT(*)-Anweisung, was aber vermutlich auf die Performance des Programms drückt. Gibt es eine Möglichkeit, dies direkt in dem eigentlichen SELECT-Statement einzubauen, oder vielleicht eine andere elegante Lösung?
Vielen Dank im Voraus!
Jörg
Ab V5 geht auch folgendes Konstrukt:
with
Tempfile as (select ...from ... where ...)
select tempfile.*, (select count(*) from tempfile) as counter from tempfile
man erhält damit ein zusätzliches Feld mit der Anzahl Sätze pro Fetch
Hallo Jörg,
bei embedded-sql wird automatisch eine Datenstruktur mit Namen "SQLCA" erstellt.
Dort gibt es das Feld SQLERRD(3), in dem die Anzahl an "gefetchten" Sätzen steht.
Schau mal ins Redbook: "DB2 Universal Database for iSeries SQL Reference"
Gruß
Alexander.
Hallo,
zunächst noch mal vielen Dank für die schnellen Antworten beim letzten Mal.
Jetzt zu meinem Problem: in einem Anzeigeprogramm lese ich per DECLARE CURSOR ... FOR SELECT... WHERE... ORDER BY Datensätze aus einer zeimlich großen Datei ein, die ich dann in einer Schleife per FETCH NEXT CFROM CURSOR INTO... weiter verarbeite. Nun müßte ich allerdings vor Beginn der Schleife wissen, wieviele Datensätze die SELECT-Anweisung denn tatsächlich ausgewählt hat. Meines Wissens geht das nur mit einer zuvor ausgeführten zusätzlichen SELECT COUNT(*)-Anweisung, was aber vermutlich auf die Performance des Programms drückt. Gibt es eine Möglichkeit, dies direkt in dem eigentlichen SELECT-Statement einzubauen, oder vielleicht eine andere elegante Lösung?
Vielen Dank im Voraus!
Jörg
@Alexander
Genau das ist doch das Problem: Die Anzahl Sätze des FETCH und nicht des SELECT !
Wenn ich also genau 1 Fetch mache und ein Satz wurde gelesen, steht der Wert auf 1.
Mache ich einen Fetch z.B. in eine Struktur mit 100 Vorkommen, kann ich darüber feststellen wieviel Sätze tatsächlich gelesen wurden (0-100).
Und beim Insert/Update/Delete steht dort auch die Anzahl betroffener Sätze.
Für die Anzahl des SELECT bleibt auch nur COUNT, wobei das Ergebnis durchaus nur temporär ist und während des Lesens geändert sein könnte (Insert/Delete anderer Job's).
Ab V5 geht auch folgendes Konstrukt:
with
Tempfile as (select ...from ... where ...)
select tempfile.*, (select count(*) from tempfile) as counter from tempfile
man erhält damit ein zusätzliches Feld mit der Anzahl Sätze pro Fetch
Hallo,
habe mit Interesse o. g. SQL-Syntax gelesen und auch schon ausprobiert.
Wo bitte kann ich die Syntax (evtl. auch für weitere Möglichkeiten) nachschlagen. Habe schon die PDF-Handbücher befragt, aber leider nichts gefunden.
Vielen Dank schon mal im voraus.
Schorsch
Im aktuellen SQL-Reference V5, Stichwort "Common-Table-Expression"
http://publib.boulder.ibm.com/iseries/v5r2/ic2929/info/sqlp/rbafymst126.htm
http://publib.boulder.ibm.com/iseries/v5r2/ic2929/info/db2/rbafzmstintsel.htm
Hallo,
Ich wundere mich immer wieder für was sich die Leute so interessieren; bei Rekord Löffel Exzess kriegt man das garnicht raus ....
mfg
Dieter Bender
@BenderD
Schon mal was von der Dateiinformations-DS gehört? Da stehen die Anzahl Datensätze einfach so drin.
Muss man den Stil von BenderD pflegen um "Professional User" zu werden?
@Bogomil
Es ging um SQL und nicht normale Dateibearbeitung. Dort gibts keine INFDS !
Und wie willst du per INFDS die Anzahl zu verarbeitender Sätze herausbekommen, wenn per Bedingung (where beim Select) nur ein paar der Sätze verarbeitet werden müssen ?
Und was den Stil angeht: Prof.User wird man, wenn man das Thema nicht verfehlt.