FETCH
FETCH - 使用游标从查询中检索行
语法格式
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 使用先前创建的游标检索行。
游标具有关联的位置, FETCH使用该位置。游标位置可以位于查询结果的第一行之前,结果的任何特定行之上,也可以位于结果的最后一行之后。创建时,光标位于第一行之前。获取一些行后,光标位于最近检索的行上。如果FETCH在可用行的末尾运行,则光标将位于最后一行之后,或者如果向后取回则位于第一行之前。FETCH ALL 或 FETCH BACKWARD ALL将始终将光标置于最后一行之后或第一行之前。
表格 NEXT , PRIOR , FIRST , LAST , ABSOLUTE , RELATIVE在适当移动光标后获取单行。如果没有这样的行,则返回空结果,并且光标将根据需要保留在第一行之前或最后一行之后。
使用 FORWARD 和 BACKWARD的表单检索向前或向后移动的指定行数,使光标位于最后返回的行上(如果 count超过可用行数,则在所有行之后/之前)。
RELATIVE 0 , FORWARD 0 和 BACKWARD 0所有请求都在不移动光标的情况下获取当前行,即重新获取最近获取的行。除非光标位于第一行之前或最后一行之后,否则这将成功;在这种情况下,不返回任何行。
注意
此页面描述了SQL命令级别的游标用法。
参数说明
direction
direction 定义了获取方向和要获取的行数。它可以是以下之一:
NEXT
获取下一行。如果省略 direction ,则这是默认值。
PRIOR
获取前一行。
FIRST
获取查询的第一行(与 ABSOLUTE 1 相同)。
LAST
获取查询的最后一行(与 ABSOLUTE -1 相同)。
ABSOLUTE count
如果 count 为负,则获取查询的 count '行,或者从末尾获取 abs(count)'行。如果 count超出范围,则在第一行之前或最后一行之后的位置;特别是在第一行之前的ABSOLUTE 0 位置。
RELATIVE count
如果 count 为负,则获取 count 后续行,或 abs(count) 前一行。 RELATIVE 0重新获取当前行(如果有)。
count
获取下一行 count 行(与 FORWARD count 相同)。
ALL
获取所有剩余行(与 FORWARD ALL 相同)。
FORWARD
获取下一行(与 NEXT 相同)。
FORWARD count
获取下一个 count 行。 FORWARD 0 重新获取当前行。
FORWARD ALL
获取所有剩余的行。
BACKWARD
获取前一行(与 PRIOR 相同)。
BACKWARD count
获取前面的 count 行(向后扫描)。 BACKWARD 0 重新获取当前行。
BACKWARD ALL
获取所有先前的行(向后扫描)。
count
count 是一个可能有符号的整数常量,用于确定要获取的行的位置或数量。对于FORWARD 和 BACKWARD 情况,指定负 count 等同于更改 FORWARD 和 BACKWARD的含义。
cursor_name
打开游标的名称。
输出
成功完成后, FETCH 命令将返回表单的命令标记
FETCH count
count是获取的行数(可能为零)。请注意,在psql中,实际上不会显示命令标记,因为psql会显示提取的行。
注意事项
如果打算使用除 FETCH NEXT 或 FETCH FORWARD 之外的 FETCH的任何变量并使用正计数,则应使用 SCROLL选项声明游标。对于简单的查询,Vastbase E100将允许从未使用 SCROLL声明的游标进行向后提取,但这种行为是最好的不依赖。如果使用 NO SCROLL 声明游标,则不允许向后提取。
ABSOLUTE fetches并不比使用相对移动导航到所需行更快:底层实现必须遍历所有中间行。负绝对提取甚至更糟:查询必须读到最后才能找到最后一行,然后从那里向后遍历。但是,倒带到查询的开头(与FETCH ABSOLUTE 0 一样)很快。
DECLARE用于定义游标。使用 MOVE更改光标位置而不检索数据。
示例
以下示例使用游标遍历表:
BEGIN WORK;
-- 建立一个游标:
DECLARE liahona SCROLL CURSOR FOR SELECT * FROM films;
-- 在游标 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
-- 关闭游标并且结束事务:
CLOSE liahona;
COMMIT WORK;