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 NEXT
或 FETCH FORWARD
且計數值為正數以外的 FETCH
變體,則遊標應使用 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
的選項,或完全省略它們,是擴充套件。
如果您在文件中發現任何不正確、與您使用特定功能時的經驗不符或需要進一步澄清的內容,請使用 此表單 來報告文件問題。