| PostgreSQL 8.0.0 中文文件(轉譯自 PostgreSQL 中國 製作的簡體中文版本) | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Fast Forward | Next | |
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 協議聲明資料是用文本還是用二進制格式檢索。 這個選擇覆蓋游標的定義。因此,在使用擴展查詢協議的時候, 二進制游標的概念已經過時了 — 任何游標都可以當作文本或者二進制的格式發出。
將在隨後FETCH操作中使用的游標名。
令游標以二進制而不是文本格式獲取資料。
資料表明從游標檢索出來的資料不應該被其他進程或游標的更新動作影響。 在 PostgreSQL 裡,所有游標都是不敏感的, 這個關鍵字沒有什麼作用,提供它只是為了和 SQL 標準兼容。
SCROLL 聲明該游標可以用於以非順序的方式檢索資料行(也就是向後檢索)。 根據查詢的執行計劃的不同,聲明 SCROLL 可能會對查詢的執行時間附加一定的影響。 NO SCROLL 聲明該游標不能用於以非順序的方式檢索資料行(也就是向後檢索)。
WITH HOLD 聲明該游標可以在建立它的交易成功提交後繼續使用。 WITHOUT HOLD 聲明該游標不能在建立它的的交易提交後使用。如果既沒有聲明 WITHOUT HOLD,也沒有聲明 WITH HOLD, 那麼預設是 WITH HOLD。
一個SELECT查詢,它提供由游標返回的行。 請參考 SELECT 語句獲取有關有效查詢的詳細訊息。
FOR READ ONLY 資料表明游標將用於只讀模式。 FOR UPDATE 資料表明游標將被用於更新資料表。 因為目前 PostgreSQL 不支援游標更新, 所以聲明 FOR UPDATE 將產生一個錯誤訊息。而聲明 FOR READ ONLY 沒有作用。
將被更新的列。因為游標更新目前不被 PostgreSQL 支援, 所以 FOR UPDATE 子句將產生一個錯誤訊息。
BINARY,INSENSITIVE, SCROLL 關鍵字可以以任何順序出現。
如果沒有聲明 WITH HOLD,那麼這個命令建立的游標只能在目前交易中使用。使用 BEGIN, COMMIT 和 ROLLBACK 定義一個交易。
如果聲明了 WITH HOLD,並且建立該游標的交易成功提交, 那麼游標還可以在同一會話隨後的交易裡訪問。(但如果建立它的交易回滾,那麼游標被刪除。) 帶著 WITH HOLD 建立的游標是用一個明確的 CLOSE 命令,或者是會話終止來關閉的。 在目前的實現裡,由一個游標代資料表的行是被拷貝到一個臨時文件或者內存區裡的,這樣他們就仍然可以在隨後的交易中被訪問。
在定義一個要用來向後抓取的游標的時候,我們應該聲明 SCROLL 選項。 這個是 SQL 標準要求的。不過,為了和早期的版本兼容, PostgreSQL 在沒有 SCROLL 的時候也允許向後抓取, 只要游標的查詢計劃簡單得不需要額外的開銷就可以支援它。 不過,我們建議應用開發人員不要依賴於使用沒有帶著 SCROLL 定義的游標的後向查找功能。如果聲明了 NO SCROLL,那麼不管怎樣都會禁止向後抓取的功能。
在 SQL 標準中游標只能在嵌入 SQL (ESQL) 的應用中使用。 PostgreSQL 伺服器沒有一個明確的 OPEN 語句;一個游標被認為在定義時就已經打開了。 不過,PostgreSQL嵌入的 SQL 預編譯器, ecpg, 支援 SQL92 習慣,包括那些和DECLARE和OPEN相關的語句。