?
Dieses Dokument verwendet PHP-Handbuch für chinesische Websites Freigeben
FETCH [ direction [ FROM | IN ] ] cursor_name
where direction can be empty or one of:
NEXT
PRIOR
FIRST
LAST
ABSOLUTE count
RELATIVE count
count
ALL
FORWARD
FORWARD count
FORWARD ALL
BACKWARD
BACKWARD count
BACKWARD ALL
FETCH使用游標(biāo)檢索行。
一個(gè)游標(biāo)有一個(gè)由FETCH使用的相關(guān)聯(lián)的位置。游標(biāo)的位置可以在查詢結(jié)果的 第一行之前,或者在結(jié)果中的任意行,或者在結(jié)果的最后一行之后。剛創(chuàng)建完之后,游標(biāo)是 放在第一行之前的。在抓取了一些行之后,游標(biāo)放在檢索到的最后一行上。如果 FETCH抓完了所有可用行,那么它就停在最后一行后面,或者在反向抓去的情 況下是停在第一行前面。FETCH ALL或FETCH BACKWARD ALL將總 是把游標(biāo)的位置放在最后一行或者在第一行前面。
NEXT,PRIOR,FIRST,LAST,ABSOLUTE,RELATIVE形式在恰當(dāng)?shù)匾苿佑螛?biāo)之后抓取一個(gè)行。如果沒有數(shù)據(jù)行了,那么返回一個(gè)空的結(jié)果,此時(shí)游標(biāo)就會停在查詢結(jié)果的最后一行之后或者第一行之前。
FORWARD和BACKWARD形式在向前或者向后移動的過程中抓取指定的行數(shù), 然后把游標(biāo)定位在最后返回的行上;或者是,如果count 大于可用的行數(shù),則在所有行之前或之后。
RELATIVE 0,FORWARD 0,BACKWARD 0都要求在 不移動游標(biāo)的前提下抓取當(dāng)前行,也就是重新抓取最近剛剛抓取過的行。除非游標(biāo)定位 在第一行之前或者最后一行之后,這個(gè)動作都應(yīng)該成功,而在那兩種情況下,不返回任何行。
Note: 該頁面在SQL命令級描述了游標(biāo)的使用。如果您試圖在一個(gè)PL/pgSQL函數(shù)內(nèi) 使用游標(biāo),規(guī)則是不同的—詳情請參閱Section 39.7。
direction定義抓取的方向和抓取的行數(shù)。 它可以是下述之一:
抓取下一行(缺省)
抓取前面一行
抓取查詢的第一行(和ABSOLUTE 1相同)
抓取查詢的最后一行(和ABSOLUTE -1相同)
抓取查詢中第count行,或者如果 count為負(fù)就從查詢結(jié)果末尾抓取第 abs(count)行。 如果count超出了范圍,那么定位在 第一行之前和最后一行之后的位置;特別是ABSOLUTE 0定位在第 一行之前。
抓取隨后的第count行,或者如果 count為負(fù)就抓取前面的第 abs(count)行。 如果有數(shù)據(jù)的話,RELATIVE 0重新抓取當(dāng)前行。
抓取隨后的count行(和 FORWARD count 一樣)
抓取所有剩余的行(和FORWARD ALL一樣)
抓取下一行(和NEXT一樣)
抓取隨后的count行。 FORWARD 0重新抓取當(dāng)前行。
抓取所有剩余行
抓取前面一行(和PRIOR一樣)
抓取前面的count行(向后掃描)。 BACKWARD 0重新抓取當(dāng)前行。
抓取所有前面的行(向后掃描)
count可能是一個(gè)有符號的整數(shù)常量, 決定要抓取的行數(shù)和方向。對于FORWARD和BACKWARD的情況, 聲明一個(gè)帶負(fù)號的count等效于改變 FORWARD和BACKWARD的方向。
一個(gè)打開的游標(biāo)的名稱
成功完成時(shí),一個(gè)FETCH命令返回一個(gè)形如下面的標(biāo)記
FETCH count
這里的count是抓取的行數(shù)(可能是零)。請注意在psql里,命令標(biāo)簽實(shí)際上不會顯示,因?yàn)?span id="377j5v51b" class="APPLICATION">psql用抓取的行數(shù)代替了。
如果你想使用FETCH NEXT之外的任何FETCH變種,或者是帶負(fù) 數(shù)計(jì)數(shù)的FETCH FORWARD。那么定義游標(biāo)的時(shí)候應(yīng)該帶上SCROLL 選項(xiàng)。對于簡單的查詢,PostgreSQL會允許那些沒有帶 SCROLL選項(xiàng)定義的游標(biāo)也可以反向抓取,但是最好不要依賴這個(gè)行為。 如果游標(biāo)定義了NO SCROLL,那么不允許反向抓取。
ABSOLUTE抓取不會比用相對位移移動到需要的數(shù)據(jù)行更快: 因?yàn)橄聦拥膶?shí)現(xiàn)必須遍歷所有中間的行。負(fù)數(shù)的絕對抓取甚至更糟糕:查詢必須 一直讀到結(jié)尾才能找到最后一行,然后從那里開始反向遍歷。不過,回退到查詢開頭 (比如FETCH ABSOLUTE 0)很快。
DECLARE適用于定義游標(biāo)的。使用 MOVE來改變沒有檢索數(shù)據(jù)的光標(biāo)位置。
下面的例子用一個(gè)游標(biāo)跨過一個(gè)表:
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 標(biāo)準(zhǔn)定義的FETCH只用于嵌入式環(huán)境下。這里描述的 FETCH變種是把結(jié)果數(shù)據(jù)像SELECT結(jié)果那樣返回, 而不是把它放在屬主變量里。除了這點(diǎn)之外,FETCH和 SQL 標(biāo)準(zhǔn)完全向前兼容。
涉及FORWARD和BACKWARD的FETCH形式, 包括FETCH count和 FETCH ALL形式(此時(shí)FORWARD是隱含的),是 PostgreSQL的擴(kuò)展。
SQL標(biāo)準(zhǔn)僅允許FROM在游標(biāo)名之前;使用IN,或者讓他們?nèi)砍鼍值? 選項(xiàng)是一個(gè)擴(kuò)展。