💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# FETCH ## Name FETCH -- 用游标从查询中抓取行 ## Synopsis ``` 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` 都要求在不移动游标的前提下抓取当前行,也就是重新抓取最近刚刚抓取过的行。 除非游标定位在第一行之前或者最后一行之后,这个动作都应该成功, 而在那两种情况下,不返回任何行。 > **Note:** 本页描述在SQL命令级别的游标的使用。如果你尝试在PL/pgSQL 里使用游标,那么规则是不同的,参阅[Section 40.7](#calibre_link-491)。 ## 参数 `_direction_` `_direction_`定义抓取的方向和抓取的行数。 它可以是下述之一: `NEXT` 抓取下一行(缺省)。 `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`变种,或者是带负数计数的 `FETCH FORWARD`,那么定义游标的时候应该带上`SCROLL`选项。 对于简单的查询,PostgreSQL会允许那些没有带`SCROLL` 选项定义的游标也可以反向抓取,但是最好不要依赖这个行为。如果游标定义了 `NO SCROLL`,那么不允许反向抓取。 `ABSOLUTE`抓取不会比用相对位移移动到需要的数据行更快: 因为下层的实现必须遍历所有中间的行。负数的绝对抓取甚至更糟糕: 查询必须一直读到结尾才能找到最后一行,然后从那里开始反向遍历。不过, 回退到查询开头(比如`FETCH ABSOLUTE 0`)很快。 使用[DECLARE](#calibre_link-72)语句定义一个游标。[MOVE](#calibre_link-75) 语句改变游标位置而不检索数据。 ## 例子 下面的例子用一个游标跨过一个表。 ``` BEGIN WORK; -- 建立一个游标: DECLARE liahona SCROLL CURSOR FOR SELECT * FROM films; -- 抓取头5行到游标liahona里: 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; ``` ## 兼容性 SQL 标准定义的`FETCH`只用于嵌入式环境下。这里描述的 `FETCH`变种是把结果数据像`SELECT`结果那样返回, 而不是把它放在属主变量里。除了这点之外,`FETCH` 和 SQL 标准完全向前兼容。 涉及`FORWARD`和`BACKWARD`的`FETCH`形式, 包括`FETCH` `_count_`和 `FETCH ALL`形式(此时`FORWARD`是隐含的), 是PostgreSQL的扩展。 SQL 标准只允许游标前面有`FROM`,可选的`IN`,或者把它们都省去,是一个扩展。 ## 又见 [CLOSE](#calibre_link-69), [DECLARE](#calibre_link-72), [MOVE](#calibre_link-75)