Heim  >  Artikel  >  Betrieb und Instandhaltung  >  Gespeicherte Oracle-Paging-Prozeduren – effizientere Paging-Suchen

Gespeicherte Oracle-Paging-Prozeduren – effizientere Paging-Suchen

PHPz
PHPzOriginal
2023-04-17 09:48:27886Durchsuche

Mit der Entwicklung des Internets wird die Anwendung von Datenbanken immer beliebter und es müssen große Datenmengen abgefragt und verarbeitet werden. Dabei ist die Paging-Suche eine der häufigsten Anforderungen. Obwohl die Oracle-Datenbank ROWNUM als Mittel zur Implementierung von Paging-Abfragen bereitstellt, weist sie im tatsächlichen Anwendungsprozess viele Einschränkungen und Mängel auf. Daher ist die Entwicklung gespeicherter Oracle-Paging-Prozeduren eine effizientere Lösung geworden.

In diesem Artikel werden konkrete Fälle kombiniert, um vorzustellen, wie effiziente gespeicherte Paging-Prozeduren basierend auf einer Oracle-Datenbank entworfen werden können.

1. Gesamtdesign

Die Designarchitektur der gespeicherten Oracle-Paging-Prozedur kann in vier Kernteile unterteilt werden: Parameterübertragung, Datenabfrage, Daten-Paging-Berechnung und Rückgabeergebnisse.

  1. Übergabe von Parametern: Übergeben Sie die Abfrageanweisung, die aktuelle Seitennummer, die Anzahl der Datensätze pro Seite usw. als Eingabeparameter in die gespeicherte Prozedur.
  2. Datenabfrage: Abfrage basierend auf der eingehenden Abfrageanweisung, um Daten zu erhalten, die die Bedingungen erfüllen.
  3. Daten-Paging-Berechnung: Führen Sie eine Paging-Verarbeitung für die Abfrageergebnisse durch und berechnen Sie die Daten der angegebenen Seitennummer.
  4. Ergebnisse zurückgeben: Gibt die Daten der angegebenen Seitennummer und die Gesamtzahl der Datensätze zurück.

2. Spezifische Implementierung

Bei der Implementierung gespeicherter Oracle-Paging-Prozeduren müssen einige Oracle-spezifische Syntax und Funktionen verwendet werden. Es gibt also einige Grundlagen, die zunächst verstanden werden müssen.

  1. ROW_NUMBER-Funktion

ROW_NUMBER-Funktion ist ein Schlüsselwort in Oracle, das zum Zählen der Anzahl von Zeilen in einer Ergebnismenge verwendet wird. Das Rückgabeergebnis ist ein ganzzahliger Wert, der in aufsteigender Zeilenreihenfolge angeordnet ist. Hier ist ein Beispiel:

SELECT emp.*, ROW_NUMBER() OVER(ORDER BY empno) as rowno
FROM emp;

Die Funktion ROW_NUMBER im obigen Beispiel sortiert nach Mitarbeiternummer und weist eine aufsteigende Seriennummer zu. Dies ist sehr wichtig für paginierte Abfragen.

  1. Top-N-Datensatzabfrage

Wie implementiert man die Top-N-Datensatzabfrage? Oracle bietet zwei Methoden: die Funktionen ROWNUM und ROW_NUMBER(). Wie unten gezeigt:

SELECT *
FROM (
    SELECT emp.*, ROWNUM rn
    FROM emp
) t
WHERE t.rn <= N;

oder

SELECT emp.*
FROM (
    SELECT emp.*, ROW_NUMBER() OVER(ORDER BY empno) as rowno
    FROM emp
) t
WHERE t.rowno <= N;

Ersetzen Sie einfach N durch die Anzahl der Datensätze, die Sie abfragen müssen.

  1. Seitenabfrage

Seitenabfrage ist ein typisches Szenario, bei dem normalerweise die anzuzeigende Seitenzahl und die Anzahl der Datensätze pro Seite angegeben werden müssen . Dabei gibt OFFSET den Startindex der auf jeder Seite angezeigten Daten an und LIMIT gibt die maximale Anzahl der auf jeder Seite angezeigten Datensätze an. Wie unten gezeigt:

SELECT emp.*
FROM (
    SELECT emp.*, ROW_NUMBER() OVER(ORDER BY empno) as rowno
    FROM emp
) t
WHERE t.rowno > OFFSET AND t.rowno <= OFFSET+LIMIT;

Unter diesen können OFFSET und LIMIT entsprechend den spezifischen Anforderungen angepasst werden, um flexible Paging-Abfragen zu erreichen.

3. Code-Implementierung

Das Folgende ist ein Beispiel einer vollständigen gespeicherten Oracle-Paging-Prozedur:

CREATE OR REPLACE PROCEDURE paginating_demo (
    p_sql       IN    VARCHAR2,    --带有占位符(:P1,:P2...)的查询语句
    p_curPage   IN    NUMBER,      --当前页码
    p_pageSize  IN    NUMBER,      --每页的记录数量
    p_recordset OUT   SYS_REFCURSOR,--查询结果集
    p_total     OUT   NUMBER       --记录的总数
)
AS
  v_sql VARCHAR2(4000); 
  v_fromIndex NUMBER; 
  v_toIndex NUMBER;

BEGIN
  SELECT COUNT(*) INTO p_total FROM ( p_sql );

  IF (p_total > 0) THEN
    -- 计算 limit 和offset 边界值
    v_fromIndex := ((p_curPage - 1) * p_pageSize);
    v_toIndex   := (p_curPage * p_pageSize);

    v_sql := 'SELECT * FROM ( SELECT t.*, ROWNUM RN FROM ( ' || p_sql || ' ) t WHERE ROWNUM <= &#39; || v_toIndex || &#39; ) WHERE RN > ' || v_fromIndex;

    OPEN p_recordset FOR v_sql;
  END IF;

END paginating_demo;

Dieser Code fragt die aktuelle Anweisung ab Seitenzahl, die Anzahl der Datensätze pro Seite, die Abfrageergebnismenge und die Gesamtzahl der Datensätze werden als Eingabe- und Ausgabeparameter verwendet. Darunter werden die Abfrageergebnismenge und die Gesamtzahl der Datensätze als Ausgabeparameter zurückgegeben.

4. Zusammenfassung

In tatsächlichen Anwendungen verbessern Oracle-Paging-gespeicherte Prozeduren die Effizienz und Stabilität von Paging-Abfragen erheblich. Durch die Beherrschung der oben genannten Kenntnisse und Fähigkeiten können wir gespeicherte Oracle-Paging-Prozeduren flexibel in der Praxis einsetzen, um die Systemleistung und das Benutzererlebnis erheblich zu verbessern.

Das obige ist der detaillierte Inhalt vonGespeicherte Oracle-Paging-Prozeduren – effizientere Paging-Suchen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn