Manpages

NAME

DECLARE - 定 义 一 个 游 标

SYNOPSIS

DECLARE name [ BINARY ] [ INSENSITIVE ] [ [ NO ] SCROLL ]
CURSOR [ { WITH | WITHOUT } HOLD ] FOR query
[ FOR { READ ONLY | UPDATE [ OF column [, ...] ] } ]

DESCRIPTION 描 述

DECLARE 允 许 用 户 创 建 游 标 , 用 于 在 一 个 大 的 查 询 里 面 检 索 少 数 几 行 数 据 。 使 用 FETCH [fetch(7)], 游 标 可 以 既 可 以 返 回 文 本 也 可 以 返 回 二 进 制 格 式 。 通 常 游 标 返 回 文 本 格 式 , 和 SELECT 生 成 的 是 一 样 的 。 因 为 数 据 在 系 统 内 部 是 用 二 进 制 格 式 存 储 的 , 系 统 必 须 对 数 据 做 一 定 转 换 以 生 成 文 本 格 式 。 一 旦 数 据 是 以 文 本 形 式 返 回 , 那 么 客 户 端 应 用 需 要 把 它 们 转 换 成 二 进 制 进 行 操 作 。 另 外 , 文 本 格 式 一 般 都 比 对 应 的 二 进 制 格 式 占 的 存 储 空 间 大 。 二 进 制 游 标 给 你 返 回 内 部 二 进 制 形 态 的 数 据 。 当 然 , 如 果 你 想 以 文 本 方 式 显 示 数 据 , 那 么 以 文 本 方 式 检 索 会 为 你 节 约 很 多 客 户 端 的 工 作 。 比 如 , 如 果 查 询 从 一 个 整 数 列 返 回 一 个 一 , 在 缺 省 的 游 标 里 你 将 获 得 一 个 字 符 串 1, 而 如 果 是 一 个 二 进 制 游 标 , 你 将 得 到 一 个 4-字 节 的 包 含 该 数 值 内 部 形 式 的 数 值 ( 大 端 序 ) 。 游 标 应 该 小 心 使 用 二 进 制 游 标 。 一 些 用 户 应 用 如 psql 是 不 识 别 二 进 制 游 标 的 , 而 且 期 望 返 回 的 数 据 是 文 本 格 式 。

Note: 注 意 : 如 果 客 户 端 应 用 使 用 "扩 展 查 询 "协 议 发 出 FETCH 命 令 , 那 么 Bind 协 议 声 明 数 据 是 用 文 本 还 是 用 二 进 制 格 式 检 索 。 这 个 选 择 覆 盖 游 标 的 定 义 。 因 此 , 在 使 用 扩 展 查 询 协 议 的 时 候 , 二 进 制 游 标 的 概 念 已 经 过 时 了 - 任 何 游 标 都 可 以 当 作 文 本 或 者 二 进 制 的 格 式 发 出 。

PARAMETERS 参 数

name 将 在 随 后

FETCH操 作 中 使 用 的 游 标 名 。

BINARY 令 游 标 以

二 进 制 而 不 是 文 本 格 式 获 取 数 据 。

INSENSITIVE 表 明 从 游 标 检 索 出 来 的 数 据 不 应 该 被 其 他 进 程 或 游 标 的 更 新 动 作 影 响 。 在 PostgreSQL 里 , 所 有 游 标 都 是 不 敏 感 的 , 这 个 关 键 字 没 有 什 么 作 用 , 提 供 它 只 是 为 了 和 SQL 标 准 兼 容 。

SCROLL

NO SCROLL

SCROLL 声 明 该 游 标 可 以 用 于 以 非 顺 序 的 方 式 检 索 数 据 行 ( 也 就 是 向 后 检 索 ) 。 根 据 查 询 的 执 行 计 划 的 不 同 , 声 明 SCROLL 可 能 会 对 查 询 的 执 行 时 间 附 加 一 定 的 影 响 。 NO SCROLL 声 明 该 游 标 不 能 用 于 以 非 顺 序 的 方 式 检 索 数 据 行 ( 也 就 是 向 后 检 索 ) 。

WITH HOLD
WITHOUT HOLD

WITH HOLD 声 明 该 游 标 可 以 在 创 建 它 的 事 务 成 功 提 交 后 继 续 使 用 。 WITHOUT HOLD 声 明 该 游 标 不 能 在 创 建 它 的 的 事 务 提 交 后 使 用 。 如 果 既 没 有 声 明 WITHOUT HOLD, 也 没 有 声 明 WITH HOLD, 那 么 缺 省 是 WITH HOLD。

query 一 个

SELECT查 询 , 它 提 供 由 游 标 返 回 的 行 。 请 参 考 SELECT 语 句 获 取 有

关 有 效 查 询 的 详 细 信 息 。

FOR READ ONLY
FOR UPDATE

FOR READ ONLY 表 明 游 标 将 用 于 只 读 模 式 。 FOR UPDATE 表 明 游 标 将 被 用 于 更 新 表 。 因 为 目 前 PostgreSQL 不 支 持 游 标 更 新 , 所 以 声 明 FOR UPDATE 将 产 生 一 个 错 误 信 息 。 而 声 明 FOR READ ONLY 没 有 作 用 。

column 将 被 更 新 的 列 。 因 为 游 标 更 新 目 前 不 被

PostgreSQL 支 持 , 所 以 FOR

UPDATE 子 句 将 产 生 一 个 错 误 信 息 。

BINARY, INSENSITIVE, SCROLL 关 键 字 可 以 以 任 何 顺 序 出 现 。

NOTES 注 意

如 果 没 有 声 明 WITH HOLD, 那 么 这 个 命 令 创 建 的 游 标 只 能 在 当 前 事 务 中 使 用 。 Thus, DECLARE without WITH HOLD is useless outside a transaction block: the cursor would survive only to the completion of the statement. Therefore PostgreSQL reports an error if this command is used outside a transaction block. 使 用 BEGIN [begin(7)], COMMIT [commit(7)] 和 ROLLBACK [rollback(7)] 定 义 一 个 事 务 块 。 如 果 声 明 了 WITH HOLD, 并 且 创 建 该 游 标 的 事 务 成 功 提 交 , 那 么 游 标 还 可 以 在 同 一 会 话 随 后 的 事 务 里 访 问 。 ( 但 如 果 创 建 它 的 事 务 回 滚 , 那 么 游 标 被 删 除 。 ) 带 着 WITH HOLD 创 建 的 游 标 是 用 一 个 明 确 的 CLOSE 命 令 , 或 者 是 会 话 终 止 来 关 闭 的 。 在 目 前 的 实 现 里 , 由 一 个 游 标 代 表 的 行 是 被 拷 贝 到 一 个 临 时 文 件 或 者 内 存 区 里 的 , 这 样 他 们 就 仍 然 可 以 在 随 后 的 事 务 中 被 访 问 。 在 定 义 一 个 要 用 来 向 后 抓 取 的 游 标 的 时 候 , 我 们 应 该 声 明 SCROLL 选 项 。 这 个 是 SQL 标 准 要 求 的 。 不 过 , 为 了 和 早 期 的 版 本 兼 容 , PostgreSQL 在 没 有 SCROLL 的 时 候 也 允 许 向 后 抓 取 , 只 要 游 标 的 查 询 计 划 简 单 得 不 需 要 额 外 的 开 销 就 可 以 支 持 它 。 不 过 , 我 们 建 议 应 用 开 发 人 员 不 要 依 赖 于 使 用 没 有 带 着 SCROLL 定 义 的 游 标 的 后 向 查 找 功 能 。 如 果 声 明 了 NO SCROLL, 那 么 不 管 怎 样 都 会 禁 止 向 后 抓 取 的 功 能 。 在 SQL 标 准 中 游 标 只 能 在 嵌 入 SQL ( ESQL) 的 应 用 中 使 用 。 PostgreSQL 服 务 器 没 有 一 个 明 确 的 OPEN 语 句 ; 一 个 游 标 被 认 为 在 定 义 时 就 已 经 打 开 了 。 不 过 , PostgreSQL嵌 入 的 SQL 预 编 译 器 , ecpg, 支 持 SQL92 习 惯 , 包 括 那 些 和 DECLARE和 OPEN相 关 的 语 句 。

EXAMPLES 例 子

定 义 一 个 游 标 :

DECLARE liahona CURSOR FOR SELECT * FROM films; 参 阅 FETCH [fetch(7)] 获 取 有 关 游 标 使 用 的 更 多 例 子 。

COMPATIBILITY 兼 容 性

SQL 标 准 只 允 许 在 嵌 入 的 SQL 中 和 模 块 中 使 用 游 标 。 PostgreSQL 允 许 交 互 地 使 用 游 标 。

SQL 标 准 允 许 游 标 更 新 表 数 据 。 所 有 PostgreSQL 的 游 标 都 是 只 读 的 。 二 进 制 游 标 是 PostgreSQL 扩 展 。

译 者

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

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