FETCH — 使用遊標從查詢中檢索行
FETCH [direction] [ FROM | IN ]cursor_namewheredirectioncan be one of: NEXT PRIOR FIRST LAST ABSOLUTEcountRELATIVEcountcountALL FORWARD FORWARDcountFORWARD ALL BACKWARD BACKWARDcountBACKWARD 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 節。
directiondirection 定義了獲取方向和要獲取的行數。它可以是以下之一
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獲取所有前面的行(向後掃描)。
countcount 是一個可能的帶符號整數常量,用於確定要獲取的位置或行數。對於 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 和 countFETCH ALL 形式(在這些形式中,FORWARD 是隱式的),是 PostgreSQL 的擴充套件。
SQL 標準只允許在遊標名稱前使用 FROM;使用 IN 的選項,或完全省略它們,是擴充套件。
如果您在文件中發現任何不正確、與您使用特定功能時的經驗不符或需要進一步澄清的內容,請使用 此表單 來報告文件問題。