FETCH
本文介紹了FETCH的語法、參數(shù)以及示例等內(nèi)容。
簡介
FETCH
從之前創(chuàng)建的一個(gè)游標(biāo)中檢索行。
游標(biāo)具有一個(gè)相關(guān)聯(lián)的位置,FETCH
會(huì)用到該位置。 游標(biāo)位置可能會(huì)位于查詢結(jié)果的第一行之前、結(jié)果中任一行之上或者結(jié)果的最后一行之后。在被創(chuàng)建時(shí),游標(biāo)被定位在第一行之前。在取出一些行后,該游標(biāo)被定位在最近被取出的行上。如果 FETCH
運(yùn)行超過了可用行的末尾,則該游標(biāo)會(huì)被定位在最后一行之后(如果向后取,則是第一行之前)。 FETCH ALL
或者FETCH BACKWARD ALL
將總是讓游標(biāo)被定位于最后一行之后或者第一行之前。
NEXT
、PRIOR
、FIRST
、 LAST
、ABSOLUTE
、RELATIVE
形式會(huì)在適當(dāng)移動(dòng)游標(biāo)后取出一行。如果沒有這樣一行,將返回一個(gè)空結(jié)果,并且視情況將游標(biāo)定位在第一行之前或者最后一行之后。
使用FORWARD
和BACKWARD
的形式會(huì)在向前移動(dòng)或者向后移動(dòng)的方向上檢索指定數(shù)量的行,然后將游標(biāo)定位在最后返回的行上(如果 count
超過可用的行數(shù),則定位在所有行之后或者之前)。
RELATIVE 0
、FORWARD 0
以及 BACKWARD 0
都會(huì)請(qǐng)求檢索當(dāng)前行但不移動(dòng)游標(biāo),也就是重新取最近被取出的行。 只要游標(biāo)沒有被定位在第一行之前或者最后一行之后,這種操作都會(huì)成功,否則不會(huì)返回任何行。
語法
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
這個(gè)頁面描述在 SQL 命令層面上對(duì)游標(biāo)的使用。如果想要在 PL/SQL函數(shù)中使用游標(biāo),規(guī)則會(huì)有所不同。
參數(shù)
direction
direction
定義獲取方向以及要取得的行數(shù)。它可以是下列之一:NEXT
取出下一行。如果省略direction
,這將是默認(rèn)值。PRIOR
取出當(dāng)前位置之前的一行。FIRST
取出該查詢的第一行(和ABSOLUTE 1
相同)。LAST
取出該查詢的最后一行(和ABSOLUTE -1
相同)。ABSOLUTE
count
取出該查詢的第count
個(gè)行,如果count
為負(fù)則是從尾部開始取出第abs(
count
)
個(gè)行。如果count
超出范圍,將定位在第一行之前或者最后一行之后。特別地,ABSOLUTE 0
會(huì)定位在第一行之前。RELATIVE
count
取出第count
個(gè)后繼行,如果count
為負(fù)則是取出前面的第abs(
count
)
個(gè)行。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
會(huì)重新取出當(dāng)前行。BACKWARD ALL
取出所有當(dāng)前位置之前的行(反向掃描)。count
count
是一個(gè)可能帶有符號(hào)的整數(shù)常量,它決定要取得的位置或者行數(shù)。對(duì)于FORWARD
和BACKWARD
情況,指定一個(gè)負(fù)的count
等效于改變FORWARD
heBACKWARD
的意義。cursor_name
一個(gè)已打開游標(biāo)的名稱。
輸出
如果成功完成,FETCH
命令返回一個(gè)下面形式的命令標(biāo)簽:
FETCH count
count
是取得的行數(shù)(可能為零)。注意在psql中,命令標(biāo)簽將不會(huì)實(shí)際顯示, 因?yàn)閜sql會(huì)顯示被取得的行。
說明
如果想要使用FETCH
的任意變體而不使用帶有正計(jì)數(shù)的 FETCH NEXT
或者FETCH FORWARD
, 應(yīng)該用SCROLL
聲明游標(biāo)。對(duì)于簡單查詢, PolarDB將允許從不帶 SCROLL
的游標(biāo)中反向取得行,但最好不要依賴這種行為。 如果游標(biāo)被聲明為帶有SCROLL
,則不允許反向取得。
用ABSOLUTE
取行并不比用相對(duì)移動(dòng)快多少:不管怎樣, 底層實(shí)現(xiàn)都必須遍歷所有的中間行。用負(fù)絕對(duì)值獲取的情況更糟:必須讀到查詢尾部來找到最后一行,并且接著從那里反向開始遍歷。不過,回卷到查詢的開始(正如FETCH ABSOLUTE 0
)是很快的。
DECLARE被用來定義游標(biāo)。使用 MOVE可改變游標(biāo)位置而不檢索數(shù)據(jù)。
示例
下面的例子用一個(gè)游標(biāo)遍歷一個(gè)表:
BEGIN WORK;
-- 建立一個(gè)游標(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;