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 BlankPortalAssignName: portal "cursorname" already exists

このエラーは、引数 cursorname が既に宣言されていた場合に発生します。

ERROR: Named portals may only be used in begin/end transaction blocks

このエラーは、カーソルがトランザクションブロック内で宣言され なかった場合に発生します。

説明

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

カーソルは通常、ASCII または 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 の拡張です。