Provided by:
manpages-zh_1.5-1_all 
NAME
DECLARE - 定義一蚢C標
SYNOPSIS
DECLARE name [ BINARY ] [ INSENSITIVE ] [ [ NO ] SCROLL ]
CURSOR [ { WITH | WITHOUT } HOLD ] FOR query
[ FOR { READ ONLY | UPDATE [ OF column [, ...] ] } ]
DESCRIPTIONyz
DECLARE 允許使用者創建遊標, 用於在一茪j的查詢裏推阯薑祤X行數據。
使用 FETCH [fetch(7)],遊標可以既可以返回文本也可以返回二進制格式。
通常遊標返回文字格式,和 SELECT 生成的是一樣的。
因為數據在系統內部是用二進制格式存儲的,
系統必須對數據做一定轉換以生成文字格式。
一旦數據是以文本形式返回,那麼客戶端應用需n把它斨鉥咻角G進制進行操作。
另外,文字格式一般都比對應的二進制格式佔的存儲空間大。
二進制遊標給你返回內部二進制形態的數據。當然,如果你想以文本方式顯示數據,那麼以文本方式檢索會為你節約很多客戶端的工作。
比如,如果查詢從一蚞蒱C返回一茪@, 在預設的遊標裏你將獲得一茼r符串
1,而如果是一茪G進制遊標, 你將得到一 4-字節的包含該數熙“峖〞獐-
]大端序)。
遊標應該小心使用二進制遊標。一些使用者應用如 psql
是不識別二進制遊標的, 而且期望返回的數據是文字格式。
Note: 注意: 如果客戶端應用使用"擴展查詢"協議發出 FETCH 命令,
那麼 Bind 協議聲明數據是用文本還是用二進制格式檢索。 這-
蚇嚝僉郅\遊標的定義。因此,在使用擴展查詢協議的時-
唌A二進制遊標的概念已經過時了 -
任何遊標都可以當作文本或者二進制的格式發出。
PARAMETERS數
name 將在隨後FETCH操作中使用的遊標名。
BINARY 令遊標以二進制而不是文字格式獲取數據。
INSENSITIVE
表明從遊標檢索出來的數據不應該被其他進程或遊標的更新動作影響。
在 PostgreSQL 裏,所有遊標都是不敏感的,這-
蚚鶬鉿r沒有什麼作用,提供它只是為了和 SQL 標準相容。
SCROLL
NO SCROLL
SCROLL
聲明該遊標可以用於以非順序的方式檢索數據行(也就是向後檢索)。
根據查詢的執行p劃的不同,聲明 SCROLL
可能會對查詢的執行時間附加一定的影響。 NO SCROLL
聲明該遊標不能用於以非順序的方式檢索數據行(也就是向後檢索)。
WITH HOLD
WITHOUT HOLD
WITH HOLD 聲明該遊標可以在創建它的事務成功提交後繼續使用。
WITHOUT HOLD
聲明該遊標不能在創建它的的事務提交後使用。如果既沒有聲明 WITHOUT
HOLD,也沒有聲明 WITH HOLD, 那麼預設是 WITH HOLD。
query 一紎ELECT查詢,它提供由遊標返回的行。 請參考 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`N
如果沒有聲明 WITH HOLD,那麼這茤R令創建的遊標只能在當前事務中使用。
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)] 定義一茖禲C
如果聲明了 WITH HOLD,並且創建該遊標的事務成功提交,
那麼遊標還可以在同一會話隨後的事務裏訪問。(但如果創建它的事務回滾,那麼遊標被刪除。)
帶著 WITH HOLD 創建的遊標是用一茤確的 CLOSE
命令,或者是會話終止來關閉的。 在目前的實現裏,由一-
蚢C標代表的行是被拷貝到一蚆{時檔案或者記憶體區裏的,這樣他-
抴N仍然可以在隨後的事務中被訪問。
在定義一胻用來向後抓取的遊標的時唌A我抸雩蚆n明 SCROLL 選項。 這茯O SQL
標準n求的。不過,為了和朽薊漯岩賑萛e, PostgreSQL 在沒有 SCROLL 的時-
啎]允許向後抓取, 只n遊標的查詢p劃簡單得不需n額外的開銷就可以支持它。
不過,我怮媊鹿野庤}發人不n依賴於使用沒有帶著 SCROLL
定義的遊標的後向查找功能。如果聲明了 NO
SCROLL,那麼不管怎樣都會禁止向後抓取的功能。
在 SQL 標準中遊標只能在嵌入 SQL (ESQL) 的應用中使用。 PostgreSQL
伺服器沒有一茤確的 OPEN 語句;一蚢C標被認為在定義時就已經打開了。
不過,PostgreSQL嵌入的 SQL 預編譯器, ecpg, 支持 SQL92
習慣,包括那些和DECLARE和OPEN相關的語句。
EXAMPLESl
定義一蚢C標:
DECLARE liahona CURSOR FOR SELECT * FROM films;
參閱 FETCH [fetch(7)] 獲取有關 遊標使用的更多例子。
COMPATIBILITYe性
SQL 標準只允許在嵌入的 SQL 中和模塊中使用遊標。 PostgreSQL
允許交互地使用遊標。
SQL 標準允許遊標更新表數據。 所有 PostgreSQL 的遊標都是只讀的。
二進制遊標是 PostgreSQL 擴展。
者
Postgresql <laser@pgsqldb.org>