DECLARE(7) | SQL Commands | DECLARE(7) |
DECLARE - 定義一個遊標
DECLARE name [ BINARY ] [ INSENSITIVE ] [ [ NO ] SCROLL ]
CURSOR [ { WITH | WITHOUT } HOLD ] FOR query
[ FOR { READ ONLY | UPDATE [ OF column [, ...] ] } ]
DECLARE 允許用戶創建遊標, 用於在一個大的查詢裏面檢索少數幾行數據。 使用 FETCH [fetch(7)],遊標可以既可以返回文本也可以返回二進制格式。
通常遊標返回文本格式,和
SELECT 生成的是一樣的。
因爲數據在系統內部是用二進制格式存儲的,
系統必須對數據做一定轉換以生成文本格式。
一旦數據是以文本形式返回,那麼客戶端應用需要把它們轉換成二進制進行操作。
另外,文本格式一般都比對應的二進制格式佔的存儲空間大。
二進制遊標給你返回內部二進制形態的數據。當然,如果你想以文本方式顯示數據,那麼以文本方式檢索會爲你節約很多客戶端的工作。
比如,如果查詢從一個整數列返回一個一,
在缺省的遊標裏你將獲得一個字符串
1,而如果是一個二進制遊標,
你將得到一個
4-字節的包含該數值內部形式的數值(大端序)。
遊標應該小心使用二進制遊標。一些用戶應用如
psql
是不識別二進制遊標的,
而且期望返回的數據是文本格式。
BINARY,INSENSITIVE,SCROLL 關鍵字可以以任何順序出現。
如果沒有聲明 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相關的語句。
定義一個遊標:
DECLARE liahona CURSOR FOR SELECT * FROM films;
SQL 標準只允許在嵌入的 SQL 中和模塊中使用遊標。 PostgreSQL 允許交互地使用遊標。
SQL 標準允許遊標更新表數據。 所有 PostgreSQL 的遊標都是隻讀的。
二進制遊標是 PostgreSQL
擴展。
Postgresql 中文網站 何偉平 <laser@pgsqldb.org>
本頁面中文版由中文
man 手冊頁計劃提供。
中文 man
手冊頁計劃:https://github.com/man-pages-zh/manpages-zh
2003-11-02 | SQL - Language Statements |