FETCH — 使用游標從查詢中檢索列
FETCH [direction
] [ FROM | IN ]cursor_name
wheredirection
can be one of: NEXT PRIOR FIRST LAST ABSOLUTEcount
RELATIVEcount
count
ALL FORWARD FORWARDcount
FORWARD ALL BACKWARD BACKWARDcount
BACKWARD ALL
FETCH
使用先前建立的游標檢索列。
游標具有關聯的位置,FETCH
會使用該位置。游標位置可以在查詢結果的第一列之前、結果的任何特定列上,或結果的最後一列之後。建立時,游標位於第一列之前。提取一些列後,游標位於最近提取的列上。如果 FETCH
超出可用列的末尾,則游標將停留在最後一列之後,如果向後提取,則停留在第一列之前。FETCH ALL
或 FETCH BACKWARD ALL
將始終使游標停留在最後一列之後或第一列之前。
使用 NEXT
、PRIOR
、FIRST
、LAST
、ABSOLUTE
、RELATIVE
的形式在適當移動游標後提取單個列。如果沒有這樣的列,則會傳回一個空的結果,並且游標會根據需要在第一列之前或最後一列之後。
使用 FORWARD
和 BACKWARD
的形式會檢索指示數量的列,並向前或向後移動,將游標定位在最後傳回的列上(如果 count
超過可用列數,則在所有列之後/之前)。
RELATIVE 0
、FORWARD 0
和 BACKWARD 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
是一個可能帶正負號的整數常數,用於確定要提取的列的位置或數量。對於 FORWARD
和 BACKWARD
的情況,指定負的 count
等同於更改 FORWARD
和 BACKWARD
的方向。
cursor_name
已開啟游標的名稱。
成功完成後,FETCH
命令會傳回一個格式如下的命令標籤:
FETCH count
count
是提取的行數(可能為零)。請注意,在 psql 中,命令標籤實際上不會顯示,因為 psql 會顯示提取的行。
如果想要使用 FETCH
的任何變體,而不是 FETCH NEXT
或計數為正數的 FETCH FORWARD
,則應使用 SCROLL
選項宣告游標。對於簡單查詢,PostgreSQL 將允許從未使用 SCROLL
宣告的游標向後提取,但最好不要依賴此行為。 如果游標使用 NO SCROLL
宣告,則不允許向後提取。
ABSOLUTE
提取並不比使用相對移動導航到所需的行更快:底層實作無論如何都必須遍歷所有中間行。 負絕對提取更糟:必須讀取查詢到末尾才能找到最後一行,然後從那裡向後遍歷。 但是,倒帶到查詢的開頭(如使用 FETCH ABSOLUTE 0
)是很快的。
以下範例使用游標遍歷表格
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 標準完全向上相容。
涉及 FORWARD
和 BACKWARD
的 FETCH
形式,以及 FETCH
和 count
FETCH ALL
形式(其中 FORWARD
是隱式的)是 PostgreSQL 擴充功能。
SQL 標準僅允許游標名稱前有 FROM
; 使用 IN
的選項或完全省略它們是一種擴充功能。
如果您在文件中發現任何不正確、與您特定功能的使用體驗不符或需要進一步澄清的地方,請使用此表單來報告文件問題。