[11/15開催: PostgreSQL Conference Japan 2019 参加受付中] 
他のバージョンの文書 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

DECLARE

Name

DECLARE  --  カーソルの定義

Synopsis

DECLARE cursorname [ BINARY ] [ INSENSITIVE ] [ SCROLL ]
    CURSOR FOR query
    [ FOR { READ ONLY | UPDATE [ OF column [, ...] ] ]

入力

cursorname

この後にFETCH操作などで使用される、カーソルの名前です。

BINARY

カーソルによるデータの取得は、テキスト形式ではなくバイナリ形式になります。

INSENSITIVE

カーソルから取り出されたデータが他のプロセスやカーソルによる更新の影響を受けないことを示す、SQL92のキーワードです。PostgreSQLでは、カーソル操作はトランザクションの内側で行なわれますので、常にこの状態になっています。従ってこのキーワードは効果がありません。

SCROLL

1つのFETCH操作によって複数の行のデータを取り出すことができることを示す、SQL92のキーワードです。 PostgreSQLでは、常にこれは許可されているので、このキーワードは効果がありません。

query

カーソルによって管理される行を提供する、1つのSQL問い合わせです。有効な引数に関するより詳細についてはSELECT文を参照して下さい。

READ ONLY

読み取り専用モードでカーソルが使用されることを示す、 SQL92のキーワードです。これは PostgreSQLにおける唯一のカーソルのアクセスモードのため、このキーワードは効果がありません。

UPDATE

カーソルがテーブルの更新に使用されることを示す、 SQL92のキーワードです。カーソルによる更新は今のところPostgreSQLでサポートされていないため、このキーワードはこのことを伝えるエラーメッセージを表示します。

column

更新される列(複数可)です。カーソルによる更新は今のところ PostgreSQLでサポートされていないので、UPDATE句はこのことを伝えるエラーメッセージを表示します。

出力

SELECT

SELECT文の実行が成功した場合に返されるメッセージです。

NOTICE: Closing pre-existing portal "cursorname"

このエラーは、同じ名前のカーソルが現在のトランザクションブロックで既に宣言されている場合に表示されます。以前の定義は削除されます。

ERROR: DECLARE CURSOR may only be used in begin/end transaction blocks

このエラーは、トランザクションブロックの内側でカーソルが定義されていない場合に表示されます。

説明

DECLAREによって、ユーザは巨大な問い合わせの中から一度に少数の行を取り出すことに使用できるカーソルを作成することができます。 FETCHを使用して、カーソルからテキストもしくはバイナリのどちらかの形式でデータを取り出すことができます。

通常のカーソルは、PostgreSQLのバックエンドがどのように構築されたかによって、ASCIIまたはその他のエンコードスキーマのテキスト形式でデータを返します。元のデータは固有のバイナリ形式で保存されていますので、システムはテキスト形式を生成するために変換を行なう必要があります。また、テキスト形式の場合、対応するバイナリ形式よりもそのサイズが大きくなることがよくあります。情報がテキスト形式で返されると、クライアントアプリケーションは情報を処理するためにバイナリ形式に変換する必要になることがあります。BINARYカーソルによって、固有のバイナリ表現でデータを返すことができます。

例えば、問い合わせが整数の列から 1 の値を返す場合、デフォルトのカーソルでは '1'という文字列を入手することになりますが、バイナリ形式のカーソルの場合はcontrol-A (^A)と同一の4バイトの値を入手することになります。

BINARYカーソルは注意して使わなければなりません。 psqlのようなユーザアプリケーションはバイナリ形式のカーソルと認識せず、データはテキスト形式で返されるものとみなしています。

文字列表現はアーキテクチャに依存しませんが、バイナリ表現はマシンのアーキテクチャによって異なります。PostgreSQL は BINARY カーソルに関するバイトオーダとか表現形式の問題などを解決しません。ですから、クライアントマシンとサーバマシンで異なる表現 (例えば、"big-endian""little-endian")を使用する場合、バイナリ形式でデータを返さない方が良いでしょう。しかし、バイナリ形式のカーソルには、サーバからクライアントへのデータ転送の際の変換に要するオーバーヘッドが少なくなるという、多少の効果があり得ます。

Tip: ASCII形式でデータを表示する場合は、ASCII形式で結果を受けとることでクライアント側でのいくつかの処理を省くことができます。

注釈

カーソルはトランザクション内部でのみ使用可能です。トランザクションブロックを定義するには、 BEGINCOMMIT、及び、 ROLLBACK を使用して下さい。

SQL92では、カーソルは埋め込みSQL(ESQL)アプリケーションでのみ使用可能です。PostgreSQL バックエンドでは、明示的なOPEN cursor文を実装していません。カーソルは宣言された時に開いたものとみなされています。しかし、PostgreSQL用の埋め込みSQLプリプロセッサであるecpgでは、DECLAREとOPEN文などを含め、 SQL92規定をサポートしています。

使用方法

カーソルを定義します。

DECLARE liahona CURSOR
    FOR SELECT * FROM films;

互換性

SQL92

SQL92では、カーソルを埋め込みSQL内とモジュール内でのみ使用できます。PostgreSQL では対話式にカーソルを使うことができます。SQL92では、埋め込みまたはモジュール型のカーソルを使ってデータベースの情報を更新することができます。全てのPostgreSQLのカーソルは読み取り専用です。BINARYキーワードはPostgreSQLの言語拡張です。