Oracle ROWNUM und Paginierung: Häufige Probleme und Lösungen
Dieser Artikel befasst sich mit häufigen Herausforderungen, die bei der Verwendung von ROWNUM
für die Paginierung in Oracle SQL auftreten.
Problem 1: Unwirksame WHERE
-Klausel mit ROWNUM
Warum gibt SELECT * FROM Person WHERE rownum > 100
keine Ergebnisse zurück?
ROWNUM
wird nach der anfänglichen Filterungsphase (Prädikat) zugewiesen. Da ein ROWNUM
-Wert erst nach der Zuweisung erhöht wird, kann ein Wert größer als 1 auf diese Weise nicht direkt mithilfe einer WHERE
-Klausel ausgewählt werden. Keine Zeilen erfüllen die Bedingung ROWNUM > 100
.
Problem 2: ROWNUM BETWEEN
Einschränkungen
Warum ist WHERE rownum BETWEEN lowerBound AND upperBound
nicht für die Paginierung geeignet?
Diese Syntax ist auch deshalb unwirksam, weil die ROWNUM
-Zuweisung vor der WHERE
-Klauselauswertung erfolgt. Oracle kann einen Bereich von ROWNUM
Werten
Lösung: Oracle 12c und höher (Top-n-Zeilenbegrenzung)
Oracle 12c führte einen überlegenen Ansatz ein: „Top-n-Row-Limiting“ mit OFFSET
und FETCH
. Zum Beispiel:
<code class="language-sql">SELECT empno, sal FROM emp ORDER BY sal OFFSET 4 ROWS FETCH NEXT 4 ROWS ONLY;</code>
Dadurch werden die Zeilen 5–8 effizient abgerufen (Offset 4, Abruf 4). Diese Methode wird Techniken vorgezogen, die ausschließlich auf ROWNUM
.
Problem 3: Ausblenden der ROWNUM
Spalte
Wie können wir verhindern, dass die Spalte ROWNUM
im Ergebnissatz angezeigt wird?
Listen Sie einfach nur die gewünschten Spalten in der äußeren SELECT
-Anweisung auf. Alternativ können Sie in SQL*Plus den Befehl NOPRINT
verwenden, um die Ausgabe bestimmter Spalten zu unterdrücken.
Problem 4: Sicherstellung der korrekten Paginierung mit ROWNUM
(ältere Oracle-Versionen)
Kann ROWNUM
eine korrekte Paginierung erreicht werden?
Ja, aber es erfordert eine verschachtelte Abfragestruktur:
<code class="language-sql">SELECT val FROM (SELECT val, rownum AS rnum FROM (SELECT val FROM t ORDER BY val) WHERE rownum <= 8) WHERE rnum >= 5;</code>
Dadurch werden die Zeilen 5–8 korrekt abgerufen. Die innere Abfrage weist ROWNUM
zu, die mittlere Abfrage filtert basierend auf der Obergrenze und die äußere Abfrage filtert basierend auf der unteren Grenze. Allerdings bleibt die OFFSET
/FETCH
-Methode in Oracle 12c und höher die effizientere und lesbarere Option.
Das obige ist der detaillierte Inhalt vonROWNUM in Oracle: Wie erreicht man die richtige Paginierung und vermeidet häufige Fallstricke?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!