埋め込み SQL インタフェースには、プログラム内の例外条件を処理するために、単純化された方法と複雑な方法の両方が備わっています。 単純化された方法では、特定の条件が発生する度にメッセージが表示されるようにします。たとえば、以下のようにします。
EXEC SQL WHENEVER sqlerror sqlprint;
または
EXEC SQL WHENEVER not found sqlprint;
このエラー処理方法は、プログラム全体で使用することができます。
Note: EXEC SQL WHENEVER 文の使用例は他にもあります。 他の例については、その他の SQL マニュアル (Groff と Weinberg の共著、The LAN TIMES Guide to SQL など) を参照してください。
埋め込み SQL インタフェースのより強力なエラー処理は、以下に示す struct と変数 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: 処理されたタプルの OID(あるならば) */ /* 2: INSERT、UPDATE、DELTE で処理された行数 */ /* 3: 空 */ /* 4: 空 */ /* 5: 空 */ char sqlwarn[8]; /* 0: 少なくともどれかが 'W'ならば'W' */ /* 1: 'W' ならば、少なくとも 1 つの文字列がホストの */ /* 変数に保存されるときに切りつめられている */ /* 2: 空 */ /* 3: 空 */ /* 4: 空 */ /* 5: 空 */ /* 6: 空 */ /* 7: 空 */ char sqlext[8]; } sqlca;
(空のフィールドの多くは、今後のリリースで使用される可能性があります。)
もし上の SQL 文でエラーが発生しなかった場合、sqlca.sqlcode は 0 (ECPG_NO_ERROR) になります。もしsqlca.sqlcodeが0よりも小さい場合、データベース定義が与えられた問い合わせと合わないといった深刻なエラーです。もし0より大きい場合はテーブルが要求された行を含まないといった通常のエラーです。
sqlca.sqlerrm.sqlerrmc は、エラーを説明する文字列を持っています。 その文字列はソースファイルの行数で終わります。
起こり得るエラーを以下に示します。
通常は起こりません。仮想メモリに空きがないことを知らせるものです。
通常は起こりません。ライブラリの知らないものをプリプロセッサが作ったことを知らせます。プリプロセッサとライブラリのバージョンが互換性のないものを使っている可能性があります。
サーバが、マッチする変数の数よりも多い引数を返しました。 INTO :var1,:var2 リストでホスト変数をいくつか忘れた可能性があります。
サーバがホスト変数より少ない引数を返しました。 INTO :var1,:var2 リストのホスト変数が多すぎる可能性があります。
問い合わせが数行を返したにもかかわらず、指定された変数が配列になっていないことを示します。入力した SELECT が一意なものではなかったのでしょう。
ホスト変数が int 型で PostgreSQL データベースのフィールドが int では表せない別の型を含んでいることを示します。ライブラリはこの変換に strtol() を使います。
ホスト変数が unsigned int 型で PostgreSQL データベースのフィールドが unsigned int では表せない別の型を含んでいることを示します。ライブラリはこの変換に strtoul() を使います。
ホスト変数が float 型で PostgreSQL データベースのフィールドが float では表せない別の型を含んでいることを示します。ライブラリはこの変換に strtod() を使います。
ホスト変数が bool 型で PostgreSQL データベースのフィールドが 't' でも 'f' でもないということを示します。
問い合わせが空です (これは埋め込み SQL プログラムでは通常起こらないので、内部エラーの可能性があります)。
NULL 値を許容しない変数に対して、NULL 値が返されました。
配列が必要な場合に、通常の変数が使用されました。
配列が必要な場合に、データベースが通常の変数を返しました。
プログラムが、存在しない接続にアクセスしようとしています。
プログラムが、存在するが開いていない接続にアクセスしようとしています。
使用しようとしている文が用意されていません。
指定された記述子が見つかりません。使用しようとしている文が用意されていません。
指定された記述子インデックスは範囲外です。
指定された記述子が見つかりません。使用しようとしている文が用意されていません。
数値型でない変数に対してデータベースが数値を返しました。
数値型の変数に対してデータベースが数値以外の値を返しました。
PostgreSQL のエラーです。このメッセージは PostgreSQL のバックエンドからのエラーメッセージを含んでいます。
スタート、コミット、トランザクションのロールバックができないことを PostgreSQL が警告しています。
データベースへの接続ができませんでした。
問い合わせているものが見つけられないか、カーソルが最後まで来たことを示す"一般的な"エラーです。