FETCH

FETCH

使用游标从查询中检索行。

概要

FETCH [ forward_direction { FROM | IN } ]
                cursor_name
            

其中forward_direction可以为空或以下之一:

    NEXT
    FIRST
    LAST
    ABSOLUTE count
    RELATIVE count
    count
    ALL
    FORWARD
    FORWARD count
    FORWARD ALL

描述

FETCH使用先前创建的游标检索行。

Note: 本页在SQL命令级别描述游标的用法。 如果试图在PL/pgSQL函数中使用游标,则规则是不同的。 参见Greenplum PL/pgSQL过程语言

游标具有关联的位置,该位置由FETCH使用。 光标位置可以在查询结果的第一行之前,结果的任何特定行上,或者在结果的最后一行之后。 创建后,光标将位于第一行之前。 在获取了一些行之后,将光标定位在最近检索到的行上。 如果FETCH在可用行的末尾运行,则光标将位于最后一行之后。 FETCH ALL将始终使光标位于最后一行之后。

NEXTFIRSTLASTABSOLUTERELATIVE形式在适当移动光标后获取单行。 如果没有这样的行,则返回空结果,并且光标将视情况放在第一行之前或最后一行之后。

使用FORWARD的表单将检索指示的向前行的行数,将光标留在最后返回的行上(如果计数超过可用行数,则在所有行之后)。 请注意,由于不支持可滚动光标,因此无法在Greenplum数据库中后向移动光标位置。 您只能使用FETCH向前移动光标。

RELATIVE 0FORWARD 0在不移动光标的情况下请求获取当前行,即重新获取最近获取的行。 除非光标位于第一行之前或最后一行之后,否则此操作将成功,在这种情况下不会返回任何行。

输出

成功完成后,FETCH命令将返回以下形式的命令标签:

FETCH count

该计数是获取的行数(可能为零)。 请注意,在psql中,实际上不会显示command标记,因为psql只是显示提取的行。

参数

forward_direction
定义获取方向和要获取的行数。Greenplum数据库中仅允许前向提取。可以是以下之一:
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
打开的游标的名称。

注解

Greenplum数据库不支持可滚动光标,因此只能使用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光标当前位置的行中更改表filmskind列:

UPDATE films SET kind = 'Dramatic' WHERE CURRENT OF c_films;

兼容性

SQL标准仅允许在嵌入式SQL和模块中使用游标。 Greenplum数据库允许以交互方式使用游标。

这里描述的FETCH的变量将数据作为SELECT结果返回,而不是将其放在主机变量中。 除此之外,FETCH与SQL标准完全向上兼容。

涉及FORWARDFETCH形式以及其中隐含FORWARDFETCH countFETCH ALL形式都是Greenplum数据库扩展。 不支持BACKWARD

SQL标准只允许在游标名称之前使用FROM。 使用IN或完全不使用它们的选项是扩展。

另见

DECLARE , CLOSE , MOVE