DECLARE

Name

DECLARE -- 定義一個游標

Synopsis

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

描述

DECLARE 允許用戶建立游標, 用於在一個大的查詢裡面檢索少數幾行資料。 使用 FETCH,游標可以既可以返回文本也可以返回二進制格式。

通常游標返回文本格式,和 SELECT 生成的是一樣的。 因為資料在系統內部是用二進制格式儲存的, 系統必須對資料做一定轉換以生成文本格式。 一旦資料是以文本形式返回,那麼客戶端應用需要把它們轉換成二進制進行操作。 另外,文本格式一般都比對應的二進制格式占的儲存空間大。 二進制游標給您返回內部二進制形態的資料。當然,如果您想以文本方式顯示資料,那麼以文本方式檢索會為您節約很多客戶端的工作。

比如,如果查詢從一個整數列返回一個一, 在預設的游標裡您將獲得一個字元串 1,而如果是一個二進制游標, 您將得到一個 4-字元的包含該數值內部形式的數值(大端序)。

游標應該小心使用二進制游標。一些用戶應用如 psql 是不識別二進制游標的, 而且期望返回的資料是文本格式。

注意: 如果客戶端應用使用"擴展查詢"協議發出 FETCH 命令, 那麼 Bind 協議聲明資料是用文本還是用二進制格式檢索。 這個選擇覆蓋游標的定義。因此,在使用擴展查詢協議的時候, 二進制游標的概念已經過時了 — 任何游標都可以當作文本或者二進制的格式發出。

參數

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 子句將產生一個錯誤訊息。

BINARYINSENSITIVESCROLL 關鍵字可以以任何順序出現。

注意

如果沒有聲明 WITH HOLD,那麼這個命令建立的游標只能在目前交易中使用。使用 BEGINCOMMITROLLBACK 定義一個交易。

如果聲明了 WITH HOLD,並且建立該游標的交易成功提交, 那麼游標還可以在同一會話隨後的交易裡訪問。(但如果建立它的交易回滾,那麼游標被刪除。) 帶著 WITH HOLD 建立的游標是用一個明確的 CLOSE 命令,或者是會話終止來關閉的。 在目前的實現裡,由一個游標代資料表的行是被拷貝到一個臨時文件或者內存區裡的,這樣他們就仍然可以在隨後的交易中被訪問。

在定義一個要用來向後抓取的游標的時候,我們應該聲明 SCROLL 選項。 這個是 SQL 標準要求的。不過,為了和早期的版本兼容, PostgreSQL 在沒有 SCROLL 的時候也允許向後抓取, 只要游標的查詢計劃簡單得不需要額外的開銷就可以支援它。 不過,我們建議應用開發人員不要依賴於使用沒有帶著 SCROLL 定義的游標的後向查找功能。如果聲明了 NO SCROLL,那麼不管怎樣都會禁止向後抓取的功能。

在 SQL 標準中游標只能在嵌入 SQLESQL) 的應用中使用。 PostgreSQL 伺服器沒有一個明確的 OPEN 語句;一個游標被認為在定義時就已經打開了。 不過,PostgreSQL嵌入的 SQL 預編譯器, ecpg, 支援 SQL92 習慣,包括那些和DECLAREOPEN相關的語句。

例子

定義一個游標:

DECLARE liahona CURSOR FOR SELECT * FROM films;

參閱 FETCH 獲取有關 游標使用的更多例子。

相容性

SQL92 標準只允許在嵌入的 SQL 中和模塊中使用游標。 PostgreSQL 允許交互地使用游標。

SQL92 標準允許游標更新資料表資料。 所有 PostgreSQL 的游標都是只讀的。

二進制游標是 PostgreSQL 擴展。

又見

CLOSE, FETCH, MOVE