PostgreSQL FETCH

2021-09-10 16:49 更新

FETCH — 使用游標(biāo)從查詢中檢索行

大綱

FETCH [ direction [ FROM | IN ] ] cursor_name

其中 direction 可以為空或者以下之一:

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

描述

FETCH從之前創(chuàng)建的一個游標(biāo)中檢索行。

游標(biāo)具有一個相關(guān)聯(lián)的位置,FETCH會用到該位置。 游標(biāo)位置可能會位于查詢結(jié)果的第一行之前、結(jié)果中任意行之上或者 結(jié)果的最后一行之后。在被創(chuàng)建時,游標(biāo)被定位在第一行之前。在取出 一些行后,該游標(biāo)被定位在最近被取出的行上。如果 FETCH運行超過了可用行的末尾,則該游標(biāo)會被定位 在最后一行之后(如果向后取,則是第一行之前)。 FETCH ALL或者 FETCH BACKWARD ALL將總是讓游標(biāo)被定位于最后一行之后或者第一行之前。

NEXT、PRIORFIRST、 LAST、ABSOLUTERELATIVE 形式會在適當(dāng)移動游標(biāo)后取出一行。如果沒有這樣一行,將返回一個空 結(jié)果,并且視情況將游標(biāo)定位在第一行之前或者最后一行之后。

使用FORWARDBACKWARD的形式會在 向前移動或者向后移動的方向上檢索指定數(shù)量的行,然后將游標(biāo)定位在 最后返回的行上(如果count超過可用的行數(shù),則定位 在所有行之后或者之前)。

RELATIVE 0、FORWARD 0以及 BACKWARD 0都會請求檢索當(dāng)前行但不移動游標(biāo),也就是 重新取最近被取出的行。 只要游標(biāo)沒有被定位在第一行之前或者最后一行 之后,這種操作都會成功,否則不會返回任何行。

注意

這個頁面描述在 SQL 命令層面上對游標(biāo)的使用。如果想要在 PL/pgSQL函數(shù)中使用游標(biāo),規(guī)則會有所不同 — 請見第 42.7.3 節(jié)

參數(shù)

direction

direction 定義獲取方向以及要取得的行數(shù)。它可以是下列之一:

NEXT

取出下一行。如果省略direction,這將是默認(rèn)值。

PRIOR

取出當(dāng)前位置之前的一行。

FIRST

取出該查詢的第一行(和ABSOLUTE 1相同)。

LAST

取出該查詢的最后一行(和ABSOLUTE -1相同)。

ABSOLUTE count

取出該查詢的第count個行,如果count為負(fù)則是從尾部開始取出 第abs(count )個行。如果 count超出范圍,將定位在第一行 之前或者最后一行之后。特別地,ABSOLUTE 0 會定位在第一行之前。

RELATIVE count

取出第count個后繼行,如果 count為負(fù) 則是取出前面的第abs(count )個行。 RELATIVE 0重新取出當(dāng)前行(如果有)。

count

取出接下來的count行(和 FORWARD count 相同)。

ALL

取出所有剩余的行(和FORWARD ALL相同)。

FORWARD

取出下一行(和NEXT相同)。

FORWARD count

取出接下來的count行。 FORWARD 0重新取出當(dāng)前行。

FORWARD ALL

取出所有剩下的行。

BACKWARD

取出當(dāng)前行前面的一行(和PRIOR相同)。

BACKWARD count

取出前面的count行(反向掃描)。 BACKWARD 0會重新取出當(dāng)前行。

BACKWARD ALL

取出所有當(dāng)前位置之前的行(反向掃描)。

count

count 是一個可能帶有符號的整數(shù)常量,它決定要取得的位置或者行數(shù)。對于 FORWARDBACKWARD情況,指定一個負(fù)的 count等效于改變 FORWARDhe BACKWARD的意義。

cursor_name

一個已打開游標(biāo)的名稱。

輸出

如果成功完成,FETCH命令返回一個下面形式的命令標(biāo)簽:

FETCH count

count是取得的行數(shù)(可能 為零)。注意在psql中,命令標(biāo)簽將不會實際顯示, 因為psql會顯示被取得的行。

注解

如果想要使用FETCH的任意變體而不使用帶有正計數(shù)的 FETCH NEXT或者FETCH FORWARD, 應(yīng)該用SCROLL聲明游標(biāo)。對于簡單查詢, PostgreSQL將允許從不帶 SCROLL的游標(biāo)中反向取得行,但最好不要依賴這種行為。 如果游標(biāo)被聲明為帶有SCROLL,則不允許反向取得。

ABSOLUTE取行并不比用相對移動快多少:不管則樣, 底層實現(xiàn)都必須遍歷所有的中間行。用負(fù)絕對值獲取的情況更糟:必須讀到 查詢尾部來找到最后一行,并且接著從那里反向開始遍歷。不過,回卷到查詢 的開始(正如FETCH ABSOLUTE 0)是很快的。

DECLARE被用來定義游標(biāo)。使用 MOVE可改變游標(biāo)位置而不檢索數(shù)據(jù)。

示例

下面的例子用一個游標(biāo)遍歷一個表:

BEGIN WORK;

-- 建立一個游標(biāo):
DECLARE liahona SCROLL CURSOR FOR SELECT * FROM films;

-- 在游標(biāo) liahona 中取出前 5 行:
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 PRIOR FROM liahona;

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

-- 關(guān)閉游標(biāo)并且結(jié)束事務(wù):
CLOSE liahona;
COMMIT WORK;

兼容性

SQL 標(biāo)準(zhǔn)只定義FETCH在嵌入式 SQL 中使用。 這里描述的FETCH變體返回數(shù)據(jù)時就好像數(shù)據(jù)是 一個SELECT結(jié)果,而不是被放在主變量中。 除這一點之外,FETCH完全向上兼容于 SQL 標(biāo)準(zhǔn)。

涉及FORWARDBACKWARDFETCH形式,以及形式FETCH count FETCH ALL(其中FORWARD是隱式的)都是 PostgreSQL擴展。

SQL 標(biāo)準(zhǔn)只允許FROM在游標(biāo)名之前。使用 IN的選項或者完全省去它們是一種擴展。

另見

CLOSE , DECLARE, MOVE


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號