PDA

View Full Version : select into wie fetch next



Seiten : [1] 2

Robi
20-05-15, 16:23
Hi *all

habe eine Datei mit zig Mio Datensätzen.
Muß mit ganz best. Werten lesen.
Wenn ich einen passen den Satz habe folgen diverse Aktionen die ggf aussagen:
Diese Gruppe nicht!

suche nun nach einer Möglichkeit wie dieser: (RPG und SQL gemixt)


eval Start = 0

do ...
select f1, f2, f3 ... into :f1, :f2, :f3 where feld = :wert ....
and F1 > :start

Wenn diese Gruppe sich als ungünstig herausstellt:
if nichtgut
eval start = f1 + 1
endif
enddo

Nun geht das natürlich nicht weil der select ja mehr als einen Satz bringt.

Wenn ich Fetche muß ich für den neuen Startpunkt auch neu preparen
select first oder select next kenn ich aber nur im fetch.

Mach ich nen Denkfehler?

Danke
Robi

dschroeder
20-05-15, 16:37
Kannst du nicht einfach fetch first row only verwenden?

select f1, f2, f3 ... into :f1, :f2, :f3 where feld = :wert ....
and F1 > :start
fetch first row only

Dieter

BenderD
20-05-15, 17:23
... letzteres funzt ohne order by allenfalls zufällig.
Warum nicht gleich einen Cursor mit order by und where und dann lesen bis es schmeckt. Sollte man das in Sprüngen haben wollen bleibt wieder der cursor mit Hostvariable und open lesen close, Hostvar hochzählen und von vorne mit open, fetch und close. Oder der Selct into mit order by, versteht sich und Hostvar in der where Klausel mit fetch first row only...

D*B

Fuerchau
20-05-15, 17:25
Wie mein Vorredner schon sagt: fetch first 1 rows only
Wenn ein SQL mehr als 1 Zeile bringt, wird der INTO nicht ausgeführt sondern ein negativer SQLCODE gesetzt.
Nur wenn man eine Struktur mit Mehrfachvorkommen (DIM, OCCURS) hat, kann ein INTO mehr als 1 Zeile haben allerdings nicht mehr als Dimensionen, sonst gibt's wieder einen Fehler.

Robi
21-05-15, 07:59
Moin zusammen,


fetch first 1 rows only
versuch ich


... letzteres funzt ohne order by allenfalls zufällig.
die PF ist mit Index, also als PF schon sortiert.
Das passt auch. füge aber den order by noch hinzu



Warum nicht gleich einen Cursor mit order by und where und dann lesen bis es schmeckt. Sollte man das in Sprüngen haben wollen bleibt wieder der cursor mit Hostvariable und open lesen close, Hostvar hochzählen und von vorne mit open, fetch und close.

Na klar wäre das die Alternativen
@lesen bis es schmeckt
könnte im ungünstigen fall bedeuten das ich 30-40.000 Sätze überlesen muß

@open, fetch close
So hatte ich sogar angefangen. Aber mein Gefühl hat dann behaubtet: "das ist langsam"

@Baldur
Das hab ich (nachdem ich fertig war) auch festgestellt, daher die Frage.
Eine Tabellenlösung geht nicht, Unbekannt viele Sätze, von denen nur der 1. gebraucht wird.


Danke Euch
Gruß
Robert

dschroeder
21-05-15, 08:05
die PF ist mit Index, also als PF schon sortiert.
Das passt auch. füge aber den order by noch hinzu


Wenn die Sortierung für dich wichtig ist, musst du bei SQL auf JEDEN FALL ein order by angeben. Nur weil die physische Tabelle sortiert ist, muss SQL das nicht in der entsprechenden Reihenfolge verarbeiten!

Dieter

BenderD
21-05-15, 08:31
Na klar wäre das die Alternativen
@lesen bis es schmeckt
könnte im ungünstigen fall bedeuten das ich 30-40.000 Sätze überlesen muß

... wenn es denn so sei, dass es egal ist welchen von den 30-40.000 Sätzen man haben will, könnte auch ein select distinct, oder ein Group by das überlesen beseitigen können...

D*B

Pikachu
21-05-15, 09:48
Würde es vielleicht auch mit SETLL und READE gehen?

Fuerchau
21-05-15, 10:35
Native geht so was meist auch, die Anforderung ist doch aber dies mit SQL zu lösen.

Robi
21-05-15, 10:51
@Dieter
leider in dieser Konstellation nicht "ohne Klimmzüge" machbar.

@Pikach
native wollt ich nicht, da ich so viele Where Bedingungen habe