Manpages

NAME

FETCH - 用 游 标 从 查 询 中 抓 取 行

SYNOPSIS

FETCH [ direction { FROM | IN } ] cursorname

where direction can be empty or one of:

NEXT
PRIOR
FIRST
LAST
ABSOLUTE count
RELATIVE count
count

ALL
FORWARD
FORWARD count
FORWARD ALL
BACKWARD
BACKWARD count
BACKWARD ALL

DESCRIPTION 描 述

FETCH 使 用 游 标 检 索 行 。 一 个 游 标 有 一 个 由 FETCH 使 用 的 相 关 联 的 位 置 。 游 标 得 位 置 可 以 在 查 询 结 果 的 第 一 行 之 前 , 或 者 在 结 果 中 的 任 意 行 , 或 者 在 结 果 的 最 后 一 行 之 后 。 在 创 建 完 之 后 , 游 标 是 放 在 第 一 行 之 前 的 。 在 抓 取 了 一 些 行 之 后 , 游 标 放 在 检 索 到 的 最 后 一 行 上 。 如 果 FETCH 抓 完 了 所 有 可 用 行 , 那 么 它 就 停 在 最 后 一 行 后 面 , 或 者 在 向 前 抓 去 的 情 况 下 是 停 在 第 一 行 前 面 。 FETCH ALL 或 者 FETCH BACKWARD ALL 将 总 是 把 游 标 的 位 置 放 在 最 后 一 行 或 者 在 第 一 行 前 面 。

NEXT, PRIOR, FIRST, LAST, ABSOLUTE, RELATIVE 形 式 在 恰 当 地 移 动 游 标 之 后 抓 取 一 个 行 。 如 果 没 有 数 据 行 了 , 那 么 返 回 一 个 空 的 结 果 , 那 么 游 标 就 会 停 在 查 询 结 果 的 最 后 一 行 之 后 或 者 在 第 一 行 之 前 。

FORWARD 和 BACKWARD 形 式 在 向 前 或 者 向 后 移 动 的 过 程 中 抓 取 指 定 的 行 数 , 然 后 把 游 标 定 位 在 最 后 返 回 的 行 上 ( 或 者 是 , 如 果 count 大 于 可 用 的 行 数 , 在 所 有 行 之 前 或 之 后 。 )

RELATIVE 0, FORWARD 0, 和 BACKWARD 0 都 要 求 在 不 移 动 游 标 的 前 提 下 抓 取 当 前 行 - - - 也 就 是 重 新 抓 取 最 近 刚 刚 抓 取 过 的 行 。 除 非 游 标 定 位 在 第 一 行 之 前 或 者 最 后 一 行 之 后 , 这 个 动 作 都 应 该 成 功 , 而 在 那 两 种 情 况 下 , 不 返 回 任 何 行 。

PARAMETERS 参 数

direction

direction 定 义 抓 取 的 方 向 和 抓 取 的 行 数 。 它 可 以 是 下 述 之 一 :

NEXT 抓 取 下 一 行 。

direction 省 略 时 这 是 缺 省 值 。

PRIOR 抓 取 前 面 一 行 。

FIRST 抓 取 查 询 的 第 一

行 ( 和 ABSOLUTE 1 相 同 ) 。
LAST
抓 取 查 询 的 最 后 一 行 ( 和 ABSOLUTE -1 相 同 ) 。

ABSOLUTE count 抓 取 查 询 中 第 count 行 , 或 者 , 如 果 count < 0, 从 查 询 结 果 末 尾 抓 取 第 abs(count)行 。 如 果 count 超 出 了 范 围 , 那 么 定 位 在 第 一 行 之 前 和 最 后 一 行 之 后 的 位 置 ; 特 别 是 ABSOLUTE 0 定 位 在 第 一 行 之 前 。
RELATIVE
count 抓 取 随 后 的 第 count 行 , 或 者 , 如 果 count < 0 的 时 候 , 抓 取 前 面 的 第 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 的 方 向 。

cursorname 一 个 打 开 的 游 标 的 名 称 。

OUTPUTS 输 出

成 功 完 成 时 , 一 个 FETCH 命 令 返 回 一 个 形 如 下 面 的 标 记

FETCH count 这 里 的 count 是 抓 取 的 行 数 ( 可 能 是 零 ) 。 请 注 意 在 psql 里 , 命 令 标 签 实 际 上 不 会 显 示 , 因 为 psql 用 抓 取 的 行 数 取 代 了 。

NOTES 注 意

如 果 你 想 使 用 FETCH NEXT 之 外 的 任 何 FETCH 的 变 种 , 或 者 是 带 负 数 计 数 的 FETCH FORWARD。 那 么 定 义 游 标 的 时 候 应 该 带 着 SCROLL 选 项 。 对 于 简 单 的 查 询 , PostgreSQL 会 允 许 那 些 没 有 带 SCROLL 选 项 定 义 的 游 标 也 可 以 反 向 抓 取 , 但 是 我 们 最 好 不 要 依 赖 这 个 行 为 。 如 果 游 标 定 义 了 NO SCROLL, 那 么 不 允 许 反 向 抓 取 。

ABSOLUTE 抓 取 不 会 比 用 相 对 位 移 移 动 到 需 要 的 数 据 行 更 快 : 因 为 下 层 的 实 现 必 须 遍 历 所 有 中 间 的 行 。 负 数 的 绝 对 抓 取 甚 至 更 糟 糕 : 查 询 必 须 一 直 读 到 结 尾 才 能 找 到 最 后 一 行 , 然 后 从 那 里 开 始 反 向 遍 历 。 不 过 , 回 退 到 查 询 开 头 ( 就 像 FETCH ABSOLUTE 0) 很 快 。 在 游 标 中 更 新 数 据 还 不 被 PostgreSQL 支 持 。

DECLARE [declare(7)] 语 句 用 于 定 义 一 个 游 标 。 使 用 MOVE [move(7)] 语 句 来 改 变 游 标 位 置 而 不 检 索 数 据 。

EXAMPLES 例 子

下 面 的 例 子 用 一 个 游 标 跨 过 一 个 表 。

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;

COMPATIBILITY 兼 容 性

SQL 标 准 定 义 的 FETCH 只 用 于 嵌 入 式 环 境 下 。 这 里 描 述 的 FETCH 变 种 是 把 结 果 数 据 像 SELECT 结 果 那 样 返 回 , 而 不 是 把 它 放 在 宿 主 变 量 里 。 除 了 这 点 之 外 , FETCH 和 SQL 标 准 完 全 向 上 兼 容 。 涉 及 FORWARD 和 BACKWARD 的 FETCH 形 式 ( 包 括 FETCH count 和 FETCH ALL 的 形 式 , 这 个 时 候 FORWARD 是 隐 含 的 ) 是 PostgreSQL 的 扩 展 。

SQL 标 准 只 允 许 游 标 前 面 有 FROM, 用 IN 是 一 种 扩 展 。

译 者

Postgresql 中 文 网 站 何 伟 平 <laser [AT] pgsqldb.org>

本 页 面 中 文 版 由 中 文 man 手 册 页 计 划 提 供 。 中 文 man 手 册 页 计 划 : https://github.com/man-pages-zh/manpages-zh