-
Was sollen denn die ganzen Spekulationen?
Probiert's doch aus!
Mit Limit und Offset wird das Ergebnis begrenzt (beim Open wird natürlich das ganze SQL ausgeführt, wie sollte sonst bekannt sein wieviele Datensätze vorhanden sind - beim Limit und Offset ggf. nur bis zum Ende angeforderten Daten). Die Datensätze sind natürlich immer aktuell, da beim OPEN alles aktualisiert wird.
Allerdings geschieht das in Form von allen möglichen zwischen gespeicherten Pointern und temporären Objekten etc.
Die Materialisierung, also die Ausgabe der tatsächlichen (abgerufenen Daten) erfolgt so spät wie möglich, also erst kurz vor der Ausgabe. Das bedeutet, dass (im Gegensatz zu einem Scroll Cursor) eben nicht die ganzen Datensätze gelesen und geladen werden. Deshalb können mit Limit und Offset die Abfragen tatsächlich (beschleunigt bzw. optimiert werden).
Hier ein kleines Beispiel zum Ausprobieren (im Übrigen mit Statischem SQL, aber Multiple-Row Fetch).
Code:
//------------------------------------------------------------------------------
DCL-DS RefDSSales Qualified Template;
SalesDate Date;
CustNo VarChar(15);
Name VarChar(35);
Amount Packed(11: 2);
End-DS;
//------------------------------------------------------------------------------
DCL-C GblMaxRows Const(100);
DCL-S Index1 Uns(3);
DCL-S Index2 Uns(3);
DCL-S Text Char(50);
DCL-S NbrRows Int(5);
DCL-S StartDate Date(*ISO) Inz(D'2000-01-01');
DCL-DS DSSales LikeDS(RefDSSales) Dim(GblMaxRows);
DCL-DS PGMSDS PSDS Qualified;
MsgText Char(80) Pos(91);
MsgTextK Char(50) Pos(91);
End-Ds;
//------------------------------------------------------------------------------
Exec SQL Set Option Commit=*NONE, DatFmt=*ISO;
*INLR = *On;
Monitor;
For Index1 = 1 to 6;
Select;
When Index1 = 1;
NbrRows = ListSales(DSSales: '10001': StartDate: 10);
When Index1 = 2;
NbrRows = ListSales(DSSales: '10001': StartDate: 10: *On);
When Index1 = 3;
NbrRows = ListSales(DSSales: '10001': StartDate: 3: *OFF: 9);
When Index1 >= 4 and Index1 <= 6;
NbrRows = ListSales(DSSales: '10001': StartDate: 3: *On);
EndSl;
If NbrRows > *Zeros;
Dsply ('Index: '+ %Char(Index1) +' '+ %Char(NbrRows) +' Rows');
For Index2 = 1 to NbrRows;
Text = 'Date: ' + %Char(DSSales(Index2).SalesDate) +
' CustNo: ' + %Trim(DSSales(Index2).CustNo) +
' Amount: ' + %Char(DSSales(Index2).Amount);
Dsply Text;
EndFor;
Else;
Dsply 'Not Found';
EndIf;
EndFor;
On-Error;
Dsply PGMSDS.MsgTextK;
EndMon;
Return;
//******************************************************************************
DCL-Proc ListSales;
DCL-PI *N Int(5);
POutSales LikeDS(RefDSSales) Dim(GblMaxRows);
ParCustNo VarChar(15) Const Options(*Trim);
ParSalesDate Date(*ISO) Const;
ParNbrRows Int(5) Const Options(*NoPass);
ParNext Ind Const Options(*NoPass);
PInStart Int(5) Const Options(*NoPass);
End-Pi;
DCL-S RtnNbrRows Int(5);
DCL-S LocNbrRows Int(5) Inz(GblMaxRows);
DCL-S LocMaxRows Int(5);
DCL-S LocNextNbr Int(5) Static;
//----------------------------------------------------------------------------
If %Parms >= %ParmNum(ParNext) and ParNext = *On;
ElseIf %Parms >= %ParmNum(PInStart) and PInStart > 0;
LocNextNbr = PInStart;
Else;
Clear LocNextNbr;
EndIf;
If %Parms >= %ParmNum(ParNbrRows)
and ParNbrRows >= *Zeros and ParNbrRows <= GblMaxRows;
LocNbrRows = ParNbrRows;
EndIf;
Exec SQL
Declare CsrC01 Cursor For
Select SalesDate, s.CustNo, CustName1, Amount
from SalesX s join AddressX a on s.CustNo = a.CustNo
Where s.CustNo = :ParCustNo
and SalesDate > :ParSalesDate
Order By SalesDate, CustNo
Limit :LocNbrRows Offset :LocNextNbr
For Fetch Only;
Exec SQL Close CsrC01;
Exec SQL Open CsrC01;
LocMaxRows = GblMaxRows;
Exec SQL Fetch Next From CsrC01 For :LocMaxRows Rows
into :POutSales;
RtnNbrRows = SQLER3;
LocNextNbr += SQLER3;
Exec SQL Close CsrC01;
Return RtnNbrRows;
End-Proc ListSales;
Similar Threads
-
By alex61 in forum IBM i Hauptforum
Antworten: 3
Letzter Beitrag: 09-04-20, 18:20
-
By _MG_ in forum NEWSboard Programmierung
Antworten: 3
Letzter Beitrag: 25-10-17, 11:04
-
By _MG_ in forum NEWSboard Programmierung
Antworten: 5
Letzter Beitrag: 12-07-17, 15:57
-
By Creedem in forum NEWSboard Programmierung
Antworten: 2
Letzter Beitrag: 19-05-15, 11:21
-
By brittner in forum NEWSboard Programmierung
Antworten: 4
Letzter Beitrag: 18-11-13, 16:24
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