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 句はこのことを伝えるエラーメッセージを表示します。

出力

DECLARE CURSOR

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

WARNING: 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 の拡張です。