-
select into wie fetch next
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)
PHP-Code:
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
Das Notwendige steht über dem technisch machbaren.
(klingt komisch, funktioniert aber!)
-
Kannst du nicht einfach fetch first row only verwenden?
Code:
select f1, f2, f3 ... into :f1, :f2, :f3 where feld = :wert ....
and F1 > :start
fetch first row only
Dieter
-
... 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
-
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.
-
Moin zusammen,
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
Das Notwendige steht über dem technisch machbaren.
(klingt komisch, funktioniert aber!)
-
Zitat von Robi
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
-
Zitat von Robi
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
-
Würde es vielleicht auch mit SETLL und READE gehen?
-
Native geht so was meist auch, die Anforderung ist doch aber dies mit SQL zu lösen.
-
@Dieter
leider in dieser Konstellation nicht "ohne Klimmzüge" machbar.
@Pikach
native wollt ich nicht, da ich so viele Where Bedingungen habe
Das Notwendige steht über dem technisch machbaren.
(klingt komisch, funktioniert aber!)
-
Vielleicht verstehe ich die Anforderung ja nicht richtig aber ...
Du willst die kleinste F1 ermitteln, die die Bedingungen in der WHERE-Bedinung erfüllt und aus dieser F1 den ersten Satz, der evtl. noch andere Bedingungen erfüllt oder, den man durch Sortierung an die erste Stelle setzen kann?
Wenn das so ist, muss Du zunächst die kleinste F1 ermitteln, diese dann wieder mit der Tabelle verknüpfen und den gewünschten Satz selektieren, etwa so:
Code:
Exec SQL
With Minimum as (Select Min(F1) MinF1
From YourTable
Where .....)
Select F1, F2, ... FN
Into :Host1, :Host2, ... HostN
From YourTable join Minimum on F1 = MinF1
where ...
Order By ...
Fetch First Row only;
Birgitta
Similar Threads
-
By AndreasH in forum IBM i Hauptforum
Antworten: 13
Letzter Beitrag: 08-05-15, 13:09
-
By Robi in forum NEWSboard Programmierung
Antworten: 3
Letzter Beitrag: 09-03-15, 15:56
-
By MGJ79 in forum NEWSboard Programmierung
Antworten: 7
Letzter Beitrag: 24-04-14, 10:00
-
By TARASIK in forum IBM i Hauptforum
Antworten: 2
Letzter Beitrag: 19-09-02, 10:59
-
By Schnichels in forum IBM i Hauptforum
Antworten: 1
Letzter Beitrag: 11-01-02, 13:45
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks