FETCH
FETCH¶
使用游标从查询中检索行。
- 语法
-
``` sql FETCH [ forward_direction { FROM | IN } ] cursor_name
其中`forward_direction`可以为空或以下之一: ``` sql NEXT FIRST LAST ABSOLUTE count RELATIVE count count ALL FORWARD FORWARD count FORWARD ALL
- 描述
-
FETCH
使用先前创建的游标检索行。- 注意: 本页在SQL命令级别描述游标的用法。如果试图在PL/pgSQL函数中使用游标,则规则是不同的。
游标具有关联的位置,该位置由
FETCH
使用。 光标位置可以在查询结果的第一行之前,结果的任何特定行上,或者在结果的最后一行之后。创建后,光标将位于第一行之前。 在获取了一些行之后,将光标定位在最近检索到的行上。如果FETCH
在可用行的末尾运行,则光标将位于最后一行之后。FETCH ALL
将始终使光标位于最后一行之后。NEXT
,FIRST
,LAST
,ABSOLUTE
,RELATIVE
形式在适当移动光标后获取单行。如果没有这样的行,则返回空结果,并且光标将视情况放在第一行之前或最后一行之后。使用
FORWARD
的表单将检索指示的向前行的行数,将光标留在最后返回的行上(如果计数超过可用行数,则在所有行之后)。请注意,由于不支持可滚动光标,因此无法在SeaboxMPP数据库中后向移动光标位置。只能使用FETCH
向前移动光标。RELATIVE 0
和FORWARD 0
在不移动光标的情况下请求获取当前行,即重新获取最近获取的行。除非光标位于第一行之前或最后一行之后,否则此操作将成功,在这种情况下不会返回任何行。成功完成后,
FETCH
命令将返回以下形式的命令标签:FETCH count
该计数是获取的行数(可能为零)。 请注意,在
ssql
中,实际上不会显示command标记,因为ssql
只是显示提取的行。 - 参数
-
该SQL命令参数说明见下
forward_direction
-
定义获取方向和要获取的行数。SeaboxMPP数据库中仅允许前向提取。可以是以下之一:
- NEXT
- 获取下一行。如果省略了方向,则为默认设置。
- FIRST
- 提取查询的第一行(与
ABSOLUTE 1
相同)。 仅当它是使用此光标的第一个FETCH
操作时才允许。 - LAST
- 获取查询的最后一行(与
ABSOLUTE -1
相同)。
ABSOLUTE count
- 获取查询的指定行。 如果计数超出范围,则在最后一行之后定位。 只有在被指定了
count
的行向前移动游标位置才能使用。 RELATIVE count
- 在当前光标位置之前获取查询
count
行的指定行。RELATIVE 0
重新获取当前行(如果有)。 仅当count
向前移动光标位置时才允许。 count
- 获取下一个
count
行数(与FORWARD count
相同)。 ALL
- 提取所有剩余的行(与
FORWARD ALL
相同)。 FORWARD
- 获取下一行(与
NEXT
相同)。 FORWARD count
- 获取下一个
count
行数。FORWARD 0
重新获取当前行。 FORWARD ALL
- 提取所有剩余的行。
cursor_name
- 打开的游标的名称。
- 注解
-
SeaboxMPP数据库不支持可滚动光标,因此只能使用
FETCH
向前移动光标位置。ABSOLUTE
获取并不比通过相对移动导航到所需行更快:底层实现无论如何都必须遍历所有中间行。DECLARE
用于定义游标。使用MOVE
更改光标位置而不检索数据。 - 示例
-
开始事务:
BEGIN;
设置游标:
DECLARE mycursor CURSOR FOR SELECT * FROM films;
获取游标
mycursor
中的前5行:FETCH FORWARD 5 FROM mycursor; 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
关闭游标并提交事务:
CLOSE mycursor; COMMIT;
在
c_films
光标当前位置的行中更改表films
的kind
列:UPDATE films SET kind = 'Dramatic' WHERE CURRENT OF c_films;
- 兼容性说明
-
SQL标准仅允许在嵌入式SQL和模块中使用游标。 SeaboxMPP数据库允许以交互方式使用游标。
这里描述的
FETCH
的变量将数据作为SELECT
结果返回,而不是将其放在主机变量中。 除此之外,FETCH
与SQL标准完全向上兼容。涉及
FORWARD
的FETCH
形式以及其中隐含FORWARD
的FETCH count
和FETCH ALL
形式都是SeaboxMPP数据库扩展。 不支持BACKWARD
。SQL标准只允许在游标名称之前使用
FROM
。 使用IN
或完全不使用它们的选项是扩展。 - 相关SQL命令
DECLARE
,CLOSE
,MOVE