2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

FETCH

FETCH — 使用遊標從查詢中檢索行

概要

FETCH [ direction ] [ FROM | IN ] cursor_name

where direction can be one of:

    NEXT
    PRIOR
    FIRST
    LAST
    ABSOLUTE count
    RELATIVE count
    count
    ALL
    FORWARD
    FORWARD count
    FORWARD ALL
    BACKWARD
    BACKWARD count
    BACKWARD ALL

描述

FETCH 使用先前建立的遊標檢索行。

遊標有一個關聯的位置,FETCH 使用該位置。遊標位置可以是在查詢結果的第一行之前、結果的任何特定行上,或結果的最後一行之後。建立時,遊標定位在第一行之前。在獲取一些行之後,遊標定位在最近檢索的行上。如果 FETCH 超出可用行的末尾,則遊標將停留在最後一行之後,或者在向後獲取時停留在第一行之前。FETCH ALLFETCH BACKWARD ALL 將始終將遊標定位在最後一行之後或第一行之前。

形式 NEXTPRIORFIRSTLASTABSOLUTERELATIVE 在適當地移動遊標後獲取單行。如果不存在這樣的行,則返回一個空結果,並且遊標會根據情況定位在第一行之前或最後一行之後。

使用 FORWARDBACKWARD 的形式在向前或向後方向上檢索指示數量的行,將遊標定位在最後返回的行上(如果 count 超過可用行數,則定位在所有行之後/之前)。

RELATIVE 0FORWARD 0BACKWARD 0 都請求在不移動遊標的情況下獲取當前行,即重新獲取最近獲取的行。除非遊標定位在第一行之前或最後一行之後,否則此操作將成功;在這種情況下,不返回任何行。

注意

本頁描述了 SQL 命令級別的遊標用法。如果您嘗試在 PL/pgSQL 函式中使用遊標,規則會有所不同 — 請參閱 第 41.7.3 節

引數

direction

direction 定義了獲取方向和要獲取的行數。它可以是以下之一

NEXT

獲取下一行。如果省略 direction,則這是預設值。

PRIOR

獲取上一行。

FIRST

獲取查詢的第一行(等同於 ABSOLUTE 1)。

LAST

獲取查詢的最後一行(等同於 ABSOLUTE -1)。

ABSOLUTE count

獲取查詢的第 count 行,如果 count 為負數,則獲取從末尾開始的第 abs(count) 行。如果 count 超出範圍,則定位在第一行之前或最後一行之後;特別是,ABSOLUTE 0 定位在第一行之前。

RELATIVE count

獲取第 count 行之後的行,如果 count 為負數,則獲取第 abs(count) 行之前的行。RELATIVE 0 重新獲取當前行(如果存在)。

count

獲取接下來的 count 行(等同於 FORWARD count)。

ALL

獲取所有剩餘的行(等同於 FORWARD ALL)。

FORWARD

獲取下一行(等同於 NEXT)。

FORWARD count

獲取接下來的 count 行。FORWARD 0 重新獲取當前行。

FORWARD ALL

獲取所有剩餘的行。

BACKWARD

獲取上一行(等同於 PRIOR)。

BACKWARD count

獲取前面的 count 行(向後掃描)。BACKWARD 0 重新獲取當前行。

BACKWARD ALL

獲取所有前面的行(向後掃描)。

count

count 是一個可能的帶符號整數常量,用於確定要獲取的位置或行數。對於 FORWARDBACKWARD 的情況,指定負數 count 等同於改變 FORWARDBACKWARD 的方向。

cursor_name

一個已開啟遊標的名稱。

輸出

成功完成時,FETCH 命令返回一個形式為

FETCH count

的命令標籤。 count 是獲取的行數(可能為零)。請注意,在 psql 中,命令標籤實際上不會顯示,因為 psql 會顯示獲取的行。

註釋

如果打算使用 FETCH NEXTFETCH FORWARD 且計數值為正數以外的 FETCH 變體,則遊標應使用 SCROLL 選項宣告。對於簡單的查詢,PostgreSQL 將允許從未宣告 SCROLL 的遊標中向後獲取,但最好不要依賴此行為。如果遊標宣告為 NO SCROLL,則不允許向後獲取。

ABSOLUTE 獲取與使用相對移動導航到所需行相比,並沒有更快:底層實現仍然必須遍歷所有中間行。負數絕對獲取效果更差:必須讀取查詢到末尾以查詢最後一行,然後從那裡向後遍歷。然而,重置到查詢的開頭(如 FETCH ABSOLUTE 0)是快速的。

DECLARE 用於定義遊標。使用 MOVE 在不檢索資料的情況下更改遊標位置。

示例

以下示例使用遊標遍歷表

BEGIN WORK;

-- Set up a cursor:
DECLARE liahona SCROLL CURSOR FOR SELECT * FROM films;

-- Fetch the first 5 rows in the cursor liahona:
FETCH FORWARD 5 FROM liahona;

 code  |          title          | did | date_prod  |   kind   |  len
-------+-------------------------+-----+------------+----------+-------
 BL101 | The Third Man           | 101 | 1949-12-23 | Drama    | 01:44
 BL102 | The African Queen       | 101 | 1951-08-11 | Romantic | 01:43
 JL201 | Une Femme est une Femme | 102 | 1961-03-12 | Romantic | 01:25
 P_301 | Vertigo                 | 103 | 1958-11-14 | Action   | 02:08
 P_302 | Becket                  | 103 | 1964-02-03 | Drama    | 02:28

-- Fetch the previous row:
FETCH PRIOR FROM liahona;

 code  |  title  | did | date_prod  |  kind  |  len
-------+---------+-----+------------+--------+-------
 P_301 | Vertigo | 103 | 1958-11-14 | Action | 02:08

-- Close the cursor and end the transaction:
CLOSE liahona;
COMMIT WORK;

相容性

SQL 標準定義 FETCH 僅用於嵌入式 SQL。此處描述的 FETCH 變體返回資料,就好像它是 SELECT 結果一樣,而不是將其放入宿主變數。除此以外,FETCH 與 SQL 標準完全向上相容。

涉及 FORWARDBACKWARDFETCH 形式,以及 FETCH countFETCH ALL 形式(在這些形式中,FORWARD 是隱式的),是 PostgreSQL 的擴充套件。

SQL 標準只允許在遊標名稱前使用 FROM;使用 IN 的選項,或完全省略它們,是擴充套件。

另請參閱

CLOSE, DECLARE, MOVE

提交更正

如果您在文件中發現任何不正確、與您使用特定功能時的經驗不符或需要進一步澄清的內容,請使用 此表單 來報告文件問題。