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