W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
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
、PRIOR
、FIRST
、 LAST
、ABSOLUTE
、RELATIVE
形式會在適當(dāng)移動游標(biāo)后取出一行。如果沒有這樣一行,將返回一個空 結(jié)果,并且視情況將游標(biāo)定位在第一行之前或者最后一行之后。
使用FORWARD
和BACKWARD
的形式會在 向前移動或者向后移動的方向上檢索指定數(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é)。
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ù)。對于 FORWARD
和BACKWARD
情況,指定一個負(fù)的 count
等效于改變 FORWARD
he
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
)是很快的。
下面的例子用一個游標(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)。
涉及FORWARD
和BACKWARD
的 FETCH
形式,以及形式FETCH
和count
FETCH
ALL
(其中FORWARD
是隱式的)都是 PostgreSQL擴展。
SQL 標(biāo)準(zhǔn)只允許FROM
在游標(biāo)名之前。使用 IN
的選項或者完全省去它們是一種擴展。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: