DECLARE STATEMENTについて説明します。
記述形式
EXEC SQL [ AT connection_name ] DECLARE statement_name STATEMENT;
説明
DECLARE STATEMENT文は、プリペアド文の識別子を宣言する埋め込みSQLコマンドです。宣言された識別子は、以下に挙げたSQLコマンドのプリペアド文の識別子として使えます。
EXECUTE
DECLARE
DESCRIBE
PREPARE(埋め込みSQLコマンド)
PREPARE(SQLコマンド)
接続を指定してDECLARE STATEMENT文を実行することで、プリペアド文の識別子と接続とを関連付けることができます。後から実行されるSQLコマンドで接続と関連付けられた識別子を指定すると、このSQLコマンドは識別子に関連付いた接続を使用して実行されます。接続とプリペアド文の識別子間の関連はプロセス全体で共有されます。
同じ名前のプリペアド文に対して関連付けることができる接続は1つだけです。ファイルを跨いで複数回の関連付けを行った場合、2回目以降に実行されるDECLARE STATEMENT文は無視されます。同一ファイルに複数回の関連付けを行った場合、このファイルのプレコンパイルは失敗します。
あるSQLコマンドで接続と関連付けられた識別子を使用する場合、AT句は使用しないでください。AT句を用いて識別子に紐づいた接続とは異なる接続を選択した場合、実行時エラーとなります。
パラメータ
CONNECT文で設定したデータベース接続の識別子を指定します。
AT句を省略した場合、接続と識別子間の関連付けは行われません。このときDECLARE STATEMENT文は実行されますが、何の効果もありません。
プリペアド文の識別子を指定します。SQL識別子またはホスト変数のどちらかを指定できます。
使用例
DECLARE STATEMENT文は主に動的SQL文を実行するときに用いられます。
EXEC SQL BEGIN DECLARE SECTION; char dbname[128]; EXEC SQL END DECLARE SECTION; ... EXEC SQL CONNECT TO postgres AS con1; EXEC SQL CONNECT TO another_database AS con2; EXEC SQL AT con1 DECLARE sql_stmt STATEMENT; EXEC SQL DECLARE cursor_name CURSOR FOR sql_stmt; EXEC SQL PREPARE sql_stmt FROM "SELECT current_database()"; EXEC SQL OPEN cursor_name; EXEC SQL FETCH cursor_name INTO :dbname; EXEC SQL CLOSE cursor_name;
上記の例では、プリペアド文の識別子'sql_stmt'に対して、接続'con1'を関連付けています。そのため現在の接続は'con2'ですが、後に続く埋め込みSQLコマンド群は`con1`に対して実行されます。
SQLコマンドのPREPARE文を用いた場合の例を以下に示します。
EXEC SQL AT db1 DECLARE stmt STATEMENT; EXEC SQL PREPARE stmt (int) AS SELECT * FROM employee WHERE id = $1; EXEC SQL EXECUTE stmt USING 1;
上記のSELECT文は接続'db1'に対して実行されます。
互換性
標準SQLにはDECLARE STATEMENT文はありません。
関連項目
EXECUTE、DECLARE、DESCLIBE、PREPARE(埋め込みSQLコマンド)、PREPARE(SQLコマンド)
参照
埋め込みSQLコマンドの詳細については、“PostgreSQL Documentation”の“Client Interfaces”の“Embedded SQL Commands”を参照してください。
SQLコマンドの詳細については、“PostgreSQL Documentation”の“Reference”の“SQL Commands”を参照してください。