支援的版本:目前 (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 的任何變體,而不是 FETCH NEXT 或計數為正數的 FETCH FORWARD,則應使用 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

提交更正

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