PDA

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

BenderD
24-06-04, 11:37
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

Fuerchau
24-06-04, 11:43
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

zannaleer
24-06-04, 11:52
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

Fuerchau
24-06-04, 11:59
@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).

Schorsch
30-06-04, 14:22
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

Fuerchau
30-06-04, 15:08
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

Bogomil
30-06-04, 16:04
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?

Fuerchau
30-06-04, 17:00
@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.