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