DECLARE

Name

DECLARE  --  テーブルアクセス用のカーソルの定義

Synopsis

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

入力

cursorname

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

BINARY

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

INSENSITIVE

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

SCROLL

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

query

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

READ ONLY

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

UPDATE

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

column

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

出力

SELECT

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

NOTICE: Closing pre-existing portal "cursorname"

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

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

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

説明

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

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

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

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

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

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

注釈

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

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

使用方法

カーソルを定義します。

DECLARE liahona CURSOR
    FOR SELECT * FROM films;
   

互換性

SQL92

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