このセクションでは ecpg ツールの使い方を解説します.
プリプロセッサは ecpg という名前です. インストールすると Postgres の bin/ ディレクトリに置かれます.
ecpg のライブラリは libecpg.a あるいは libecpg.so という名前です. 加えてこのライブラリは Postgres サーバとの通信に libpq ライブラリを使うので, プログラムのリンクで -lecpg -lpq を指定しなければなりません.
ライブラリはいくつか「秘密の」メソッドを持っていますが, これが時として非常に役立つことがわかるはずです.
ECPGdebug(int on, FILE *stream) は第一引数を 0 以外にして呼び出すとデバッグ用ログの記録を開始します. このデバッグログは stream に対して出力されます. SQL 文のほとんどはログにその引数と結果を残します.
ほぼすべての SQL 文で呼び出される最も重要なメソッド ECPGdo は,詳細な文字列, すなわち入力変数すべてが挿入されたものと,Postgres サーバからの結果の両方をログに取ります. これは SQL 文の間違いを探し出す際に大変役に立ちます.
ECPGstatus() このメソッドはデータベースに接続されている場合に TRUE を, そうでなければ FALSE を返します.
Postgres からのエラーを検出できるようにするには,
exec sql include sqlca;のような行をソースファイルのインクルード部分に入れておきます. これは下のような sqlca という名前の構造体と変数を定義します.
struct sqlca { char sqlcaid[8]; long sqlabc; long sqlcode; struct { int sqlerrml; char sqlerrmc[70]; } sqlerrm; char sqlerrp[8]; long sqlerrd[6]; /* 0: 空 */ /* 1: 空 */ /* 2: INSERT, UPDATE, DELETE 文で処理された行数 */ /* 3: 空 */ /* 4: 空 */ /* 5: 空 */ char sqlwarn[8]; /* 0: 他の要素が 'W' であれば 'W' がセットされます */ /* 1: 'W' であれば,ホスト変数に文字列を代入する時に */ /* 少なくともひとつの値が余分を切り落とされていま */ /* す */ /* 2: 空 */ /* 3: 空 */ /* 4: 空 */ /* 5: 空 */ /* 6: 空 */ /* 7: 空 */ char sqlext[8]; } sqlca;
直前の SQL 文でエラーが発生すると sqlca.sqlcode が 0 以外の値になります. もし sqlca.sqlcode が 0 より小さな値であれば, データベースの定義が与えられた問い合わせと合致しないといった何らかの深刻なエラーです. 0 よりも大きな値であれば, テーブルが要求した行を含んでいないなどの普通のエラーです.
sqlca.sqlerrm.sqlerrmc にはエラーを説明する文字列が含まれます. 文字列はソースファイル中の該当行番号で終わります.
発生する可能性のあるエラーのリストです:
通常は発生しません.これは仮想メモリを使い尽くしてしまったことを示すものです.
通常は発生しません. これはライブラリの知らない何かをプリプロセッサが生成したことを示すものです. おそらく互換性のないバージョンのプリプロセッサとライブラリを使ったのでしょう.
これは用意したホスト変数よりも多くの引数を Postgres が返したことを意味します. おそらく INTO :var1,:var2 リストの中のホスト変数の組を忘れてしまったのでしょう.
これは用意したホスト変数よりも少ない引数を Postgres が返したことを意味します. おそらく INTO :var1,:var2 リストの中に余分なホスト変数の組があるのでしょう.
これは問い合わせが複数行を返したが,指定した変数が配列ではないことを意味します. たぶん,発行した SELECT 文が一意になるものではなかったのでしょう.
これはホスト変数の型が int であるにもかかわらず, Postgres データベースのフィールドが他の型であり, int として解釈できない値が含まれていることを意味します. ライブラリはこの変換に strtol を使います.
これはホスト変数の型が unsigned int であるにもかかわらず, Postgres データベースのフィールドが他の型であり, unsigned int として解釈できない値が含まれていることを意味します. ライブラリはこの変換に strtoul を使います.
これはホスト変数の型が float であるにもかかわらず, Postgres データベースのフィールドが他の型であり, float として解釈できない値が含まれていることを意味します. ライブラリはこの変換に strtod を使います.
これはホスト変数の型が bool であるにもかかわらず, Postgres データベースのフィールドが 't' と 'f' のいずれでもないことを意味します.
Postgres が PGRES_EMPTY_QUERY を返しました. おそらく問い合わせが実際には空だったのでしょう.
プログラムが存在しない接続にアクセスしようとしました.
プログラムがアクセスしようとした接続は存在しますがオープンはされていません.
まだ準備 (prepare) していない文を使おうとしました.
Postgres の何らかのエラーです. このメッセージには Postgres バックエンドからのエラーメッセージも含まれています.
トランザクションのコミット,あるいはロールバックを開始できないと Postgres が知らせてきました.
データベースへの接続が動作しません.
これは問い合わせをしたものが見つからない, あるいはカーソルが末端を通り過ぎたといった「普通の」エラーです.