Sie sind nun wieder eingeladen, die Diskussion spezieller technischer Probleme mit zu verfolgen. Bitte schicken Sie Fragen, Anregungen oder Antworten zu den vorgestellten Themen – ebenso wie Ihre Kritik – an unsere e-Mail-Adressen: dieter.bender@midrangemagazin.de oder redaktion@midrangemagazin.de Frage: Ich möchte mit einer SQL-Abfrage nur die ersten 10 Sätze auswählen, gibt es da eine einfache Möglichkeit?

Antwort: Bei der Verwendung eines Cursors in embedded SQL oder bei dem Zugriff aus Java über JDBC stellt sich dieses Problem eigentlich nicht. Das Öffnen eines Cursors im embedded SQL beziehungsweise das Erstellen eines ResultSets in einem Java-Programm erzeugt lediglich einen offenen Datenpfad. Gelesen wird zu diesem Zeitpunkt noch nichts.

Dieser Schritt ist eher vergleichbar mit dem Öffnen einer Datei für den satzweisen Zugriff in einem COBOL- oder RPG-Programm. Das Lesen erfolgt dann im embedded SQL mit der Ausführung der SQL-Anweisung FETCH. In einem Java-Programm liest erst der Aufruf der Methode next() des ResultSets. Alle Angaben über die Anzahl von Zeilen, soweit welche möglich sind, beziehen sich immer nur auf das Blocken zur Verbesserung des Durchsatzes.

Wenn man vorab die Anzahl der Sätze wissen will, ist es am einfachsten, zuvor ein SELECT COUNT(*) mit denselben Kriterien zu machen.

Wenn nun die Anzahl der Sätze begrenzt werden soll, kann man im Programm recht einfach steuern, wie oft man liest; hier bietet sich die Verwendung einer Zählschleife an.
Im interaktiven SQL hat man keinen Cursor zur Verfügung. Die SELECT-Anweisung selbst liest bereits; hier ist also eine andere Vorgehensweise angesagt. Ab Version V5R1 kann man hierzu auf der AS/400 eine Erweiterung des SELECT-Statements benutzen, die extra hierfür eingeführt wurde.

SELECT *
FROM kunde
WHERE ort = ‘Frankfurt’
fetch first 10 rows only

Außer dem obigen Beispiel kann man auch noch die Variante mit einer geschachtelten Abfrage in Verbindung mit der Spaltenfunktion RRN (Relative Record Number) verwenden.

SELECT *
FROM
(
SELECT *
FROM kunde
WHERE ort = ‘Frankfurt’
) AS a
WHERE RRN(a) < 10 Auf die Tabelle „Kunde“ darf man die RRN-Funktion natürlich nicht anwenden, da diese hier die Satznummer in der PF (Physical File) zurückliefern würde. Diese Variante geht auch schon unter V4R5. Wichtig ist bei den geschachtelten Abfragen immer, dass für die innere Tabelle ein Alias vergeben werden muss. Dies geschieht mit der AS-Klausel, die im obigen Beispiel der temporären Tabelle den Namen „a“ zuordnet. Den Autor Dieter Bender erreichen Sie unter dieter.bender@midrangemagazin.de