4.6. エラー処理

埋め込み 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 は、エラーを説明する文字列を持っています。 その文字列はソースファイルの行数で終わります。

起こり得るエラーを以下に示します。

-12, Out of memory in line %d.

通常は起こりません。仮想メモリに空きがないことを知らせるものです。

-200 (ECPG_UNSUPPORTED):Unsupported type %s on line %d.

通常は起こりません。ライブラリの知らないものをプリプロセッサが作ったことを知らせます。プリプロセッサとライブラリのバージョンが互換性のないものを使っている可能性があります。

-201 (ECPG_TOO_MANY_ARGUMENTS):Too many arguments line %d.

サーバが、マッチする変数の数よりも多い引数を返しました。 INTO :var1,:var2 リストでホスト変数をいくつか忘れた可能性があります。

-202 (ECPG_TOO_FEW_ARGUMENTS):Too few arguments line %d.

サーバがホスト変数より少ない引数を返しました。 INTO :var1,:var2 リストのホスト変数が多すぎる可能性があります。

-203 (ECPG_TOO_MANY_MATCHES):Too many matches line %d.

問い合わせが数行を返したにもかかわらず、指定された変数が配列になっていないことを示します。入力した SELECT が一意なものではなかったのでしょう。

-204 (ECPG_INT_FORMAT):Not correctly formatted int type:%s line %d.

ホスト変数が int 型で PostgreSQL データベースのフィールドが int では表せない別の型を含んでいることを示します。ライブラリはこの変換に strtol() を使います。

-205 (ECPG_UINT_FORMAT):Not correctly formatted unsigned type:%s line %d.

ホスト変数が unsigned int 型で PostgreSQL データベースのフィールドが unsigned int では表せない別の型を含んでいることを示します。ライブラリはこの変換に strtoul() を使います。

-206 (ECPG_FLOAT_FORMAT):Not correctly formatted floating-point type:%s line %d.

ホスト変数が float 型で PostgreSQL データベースのフィールドが float では表せない別の型を含んでいることを示します。ライブラリはこの変換に strtod() を使います。

-207 (ECPG_CONVERT_BOOL):Unable to convert %s to bool on line %d.

ホスト変数が bool 型で PostgreSQL データベースのフィールドが 't' でも 'f' でもないということを示します。

-208 (ECPG_EMPTY):Empty query line %d.

問い合わせが空です (これは埋め込み SQL プログラムでは通常起こらないので、内部エラーの可能性があります)。

-209 (ECPG_MISSING_INDICATOR):NULL value without indicator in line %d.

NULL 値を許容しない変数に対して、NULL 値が返されました。

-210 (ECPG_NO_ARRAY):Variable is not an array in line %d.

配列が必要な場合に、通常の変数が使用されました。

-211 (ECPG_DATA_NOT_ARRAY):Data read from backend is not an array in line %d.

配列が必要な場合に、データベースが通常の変数を返しました。

-220 (ECPG_NO_CONN):No such connection %s in line %d.

プログラムが、存在しない接続にアクセスしようとしています。

-221 (ECPG_NOT_CONN):Not connected in line %d.

プログラムが、存在するが開いていない接続にアクセスしようとしています。

-230 (ECPG_INVALID_STMT):Invalid statement name %s in line %d.

使用しようとしている文が用意されていません。

-240 (ECPG_UNKNOWN_DESCRIPTOR):Descriptor %s not found in line %d.

指定された記述子が見つかりません。使用しようとしている文が用意されていません。

-241 (ECPG_INVALID_DESCRIPTOR_INDEX):Descriptor index out of range in line %d.

指定された記述子インデックスは範囲外です。

-242 (ECPG_UNKNOWN_DESCRIPTOR_ITEM):Descriptor %s not found in line %d.

指定された記述子が見つかりません。使用しようとしている文が用意されていません。

-243 (ECPG_VAR_NOT_NUMERIC):Variable is not a numeric type in line %d.

数値型でない変数に対してデータベースが数値を返しました。

-244 (ECPG_VAR_NOT_CHAR):Variable is not a character type in line %d.

数値型の変数に対してデータベースが数値以外の値を返しました。

-400 (ECPG_PGSQL):Postgres error:%s line %d.

PostgreSQL のエラーです。このメッセージは PostgreSQL のバックエンドからのエラーメッセージを含んでいます。

-401 (ECPG_TRANS):Error in transaction processing line %d.

スタート、コミット、トランザクションのロールバックができないことを PostgreSQL が警告しています。

-402 (ECPG_CONNECT):Could not connect to database %s in line %d.

データベースへの接続ができませんでした。

100 (ECPG_NOT_FOUND):Data not found line %d.

問い合わせているものが見つけられないか、カーソルが最後まで来たことを示す"一般的な"エラーです。