PostgreSQL7.0手冊(cè)-用戶手冊(cè)-19. SQL命令-FETCH
2019-09-08 23:33:16
供稿:網(wǎng)友
FETCH
名稱
FETCH ― 用游標(biāo)獲取行
用法
FETCH [ selector ] [ count ] { IN | FROM } cursor
FETCH [ RELATIVE ] [ { [ # | ALL | NEXT | PRIOR ] } ] FROM ] cursor
輸入
selector
selector 定義抓取的方向.它可以是下述之一:
FORWARD
抓取后面的行.selector 省略時(shí)這是缺省值.
BACKWARD
抓取前面行.
RELATIVE
為 SQL92 兼容設(shè)置的多余鍵字.
count
count 決定抓取幾行.可以是下列之一:
#
一個(gè)表明抓取幾行的整數(shù).注意負(fù)整數(shù)等效于改變 FORWARD 和 BACKWARD 屬性.
ALL
檢索所有剩余的行.
NEXT
等效于聲明 count 為 1.
PRIOR
等效于聲明 count 為 -1.
cursor
一個(gè)打開的游標(biāo)的名稱.
輸出
FETCH 返回由聲明的游標(biāo)定義的查詢的結(jié)果.如果查詢失敗,將返回下面的信息:
NOTICE: PerformPortalFetch: portal "cursor" not found
如果 cursor 沒有定義,返回此信息.游標(biāo)必須在一個(gè)事務(wù)塊中定義.
NOTICE: FETCH/ABSOLUTE not supported, using RELATIVE
Postgres 不支持游標(biāo)的絕對(duì)定位.
ERROR: FETCH/RELATIVE at current position is not supported
SQL92 允許我們用下面語(yǔ)句在"當(dāng)前位置"不停地檢索游標(biāo)
FETCH RELATIVE 0 FROM cursor
Postgres 目前不支持這種用法;實(shí)際上,零被保留用于檢索所有行,等效于聲明 ALL 關(guān)鍵字.如果使用 RELATIVE 關(guān)鍵字, Postgres 假設(shè)用戶試圖使用 SQL92 的特性,因而返回此錯(cuò)誤.
描述
FETCH 允許用戶使用游標(biāo)檢索行.所要檢索的行數(shù)用 # 聲明.如果游標(biāo)中剩下的行小于 #,那么只有那些可用的抓過來(lái).用關(guān)鍵字 ALL 代替數(shù)字將導(dǎo)致游標(biāo)中所有剩余行被抓過來(lái).記錄可以 FORWARD (向前)抓,也可以 BACKWARD (向后)抓.缺省的方向是 FORWARD (向前).
小技巧: 可以用負(fù)數(shù)作為行記數(shù),符號(hào)等效于顛倒抓取方向關(guān)鍵字(FORWARD 和 BACKWARD).例如, FORWARD -1 等效于 BACKWARD 1.
注意
注意 FORWARD 和 BACKWARD 關(guān)鍵字是 Postgres擴(kuò)展.SQL92 語(yǔ)法也支持,在此命令的第二種形式中聲明.詳細(xì)的兼容性信息見下面.
在游標(biāo)中更新數(shù)據(jù)還不被 Postgres 支持,因?yàn)閷⒂螛?biāo)更新影射回基本表是不太可能的,這一點(diǎn)對(duì) VIEW 更新也一樣.因而用戶必須顯式的使用 UPDATE 命令來(lái)更新數(shù)據(jù).
游標(biāo)只能用于事務(wù)內(nèi)部,因?yàn)樗鼈兇鎯?chǔ)的數(shù)據(jù)跨越了多個(gè)用戶的查詢.
使用 MOVE 語(yǔ)句改變游標(biāo)位置.使用 DECLARE 語(yǔ)句定義一個(gè)游標(biāo).使用 BEGIN,COMMIT,和 ROLLBACK 語(yǔ)句獲取更多關(guān)于事務(wù)的信息.
用法
下面的例子用一個(gè)游標(biāo)跨過一個(gè)表。
-- 建立一個(gè)游標(biāo):
BEGIN WORK;
DECLARE liahona CURSOR FOR SELECT * FROM films;
-- 抓取頭 5 行到游標(biāo) liahona 里:
FETCH FORWARD 5 IN 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 BACKWARD 1 IN liahona;
code | title | did | date_prod | kind | len
-------+---------+-----+------------+--------+-------
P_301 | Vertigo | 103 | 1958-11-14 | Action | 02:08
-- 關(guān)閉游標(biāo)并提交工作:
CLOSE liahona;
COMMIT WORK;
兼容性
SQL92
注意:非嵌入式游標(biāo)的使用是 Postgres 擴(kuò)展.游標(biāo)的語(yǔ)法和用途與定義與 SQL92里定義的嵌入式用法相似。
SQL92 允許游標(biāo)在 FETCH 中的絕對(duì)定位,并且允許將結(jié)果放在顯式的變量里.
FETCH ABSOLUTE #
FROM cursor
INTO :variable [, ...]
ABSOLUTE
游標(biāo)將放置在寫明的絕對(duì)的行數(shù)的位置上.在 Postgres 中所有的行數(shù)都是相對(duì)數(shù)量,所以這一功能不支持.
:variable
目標(biāo)宿主變量.