ecpg
をInformix互換モードというモードで動作させることができます。
このモードが有効ならば、Informix E/SQL用のInformixプリプロセッサであるかのように動作します。
一般的にいうと、これにより埋め込みSQLコマンドを導入する際にEXEC SQL
プリミティブの代わりにドル記号を使用することができます。
$int j = 3; $CONNECT TO :dbname; $CREATE TABLE test(i INT PRIMARY KEY, j INT); $INSERT INTO test(i, j) VALUES (7, :j); $COMMIT;
$
とその後に続くinclude
、define
、ifdef
などのプリプロセッサ指示子の間に空白文字を含めてはなりません。
こうしないと、プリプロセッサはトークンをホスト変数として解析します。
INFORMIX
、INFORMIX_SE
という2つの互換モードがあります。
互換モードを使用するプログラムをリンクする際、ECPGに同梱されるlibcompat
とリンクすることを忘れないでください。
以前に説明した構文上の飾りの他に、Informix互換モードでは、入力、出力、データ変換関数、E/SQLからECPGで既知の埋め込みSQL文変換に関する関数もいくつか移植しています。
Informix互換モードはECPGのpgtypeslibライブラリと密接に関係しています。
pgtypeslibはSQLデータ型とCホストプログラム内のデータ型を対応付けし、ほとんどのInformix互換モードで追加された関数を使用してこれらのCホストプログラム型を操作することができます。
しかし、互換範囲は制限されています。
これはInformixの動作を真似ることはしません。
これを使用して、多少は同じ名前で同じ基本動作を行う関数を操作、提供できますが、Informixを使用しているのであれば、完全な置き換えにはなりません。
さらに一部のデータ型は異なります。
例えば、PostgreSQLの日付時刻やinterval型ではYEAR TO MINUTE
のような範囲を持ちませんので、これらはECPGではサポートできないことがわかります。
右側を切り詰めた文字列データを格納するInformixの特別な"string"仮想型はtypedef
を使用せずともInformixモードでサポートされるようになりました。
実際Informixモードでは、ECPGはtypedef sometype string;
を含むソースファイルの処理を拒絶します。
EXEC SQL BEGIN DECLARE SECTION; string userid; /* この変数は切り詰められたデータを含むことになる */ EXEC SQL END DECLARE SECTION; EXEC SQL FETCH MYCUR INTO :userid;
CLOSE DATABASE
#
このSQL文は現在の接続を閉じます。
実際、これはECPGのDISCONNECT CURRENT
と同義です。
$CLOSE DATABASE; /* 現在の接続を閉じる */ EXEC SQL CLOSE DATABASE;
FREE cursor_name
#
InformixのESQL/Cと比べECPGの動作方法に違いがあります(すなわち、純粋に文法の変換がどの段階で行われ、背後の実行時ライブラリにどの段階で依存するか)ので、ECPGにはFREE cursor_name
文はありません。
このためECPGにおいて、DECLARE CURSOR
がカーソル名を使用する実行時ライブラリ内の関数呼び出しに変換されません。
これはECPG実行時ライブラリ内ではSQLカーソルの実行状況を保持しておらず、PostgreSQLサーバ内のみで保持していることを意味します。
FREE statement_name
#
FREE statement_name
はDEALLOCATE PREPARE statement_name
の類義語です。
Informix互換モードは36.7.2の説明と異なる構造体をサポートします。 以下を参照してください。
struct sqlvar_compat { short sqltype; int sqllen; char *sqldata; short *sqlind; char *sqlname; char *sqlformat; short sqlitype; short sqlilen; char *sqlidata; int sqlxid; char *sqltypename; short sqltypelen; short sqlownerlen; short sqlsourcetype; char *sqlownername; int sqlsourceid; char *sqlilongdata; int sqlflags; void *sqlreserved; }; struct sqlda_compat { short sqld; struct sqlvar_compat *sqlvar; char desc_name[19]; short desc_occ; struct sqlda_compat *desc_next; void *reserved; }; typedef struct sqlvar_compat sqlvar_t; typedef struct sqlda_compat sqlda_t;
大域的な属性を以下に示します。
フィールド毎の属性を以下に示します。
これらはsqlvar
配列内に格納されます。
sqltype
#
フィールドの型です。
定数はsqltypes.h
内に記載されています。
sqllen
#フィールドデータ長です。
sqldata
#
フィールドデータへのポインタです。
このポインタはchar *
型です。
指し示されるデータはバイナリ書式です。
以下に例を示します。
int intval; switch (sqldata->sqlvar[i].sqltype) { case SQLINTEGER: intval = *(int *)sqldata->sqlvar[i].sqldata; break; ... }
sqlind
#
NULL指示子へのポインタです。
DESCRIBEまたはFETCHで返される場合、常に有効なポインタです。
EXECUTE ... USING sqlda;
への入力として使用される場合、NULLポインタ値はこのフィールドの値が非NULLであることを意味します。
さもなくば、有効なポインタとsqlitype
は適切に設定されなければなりません。
以下に例を示します。
if (*(int2 *)sqldata->sqlvar[i].sqlind != 0) printf("value is NULL\n");
sqlname
#フィールド名です。 ゼロ終端の文字列です。
sqlformat
#
Informixでは予約されています。
このフィールドのPQfformat
の値です。
sqlitype
#
NULL指示子データの型です。
サーバからデータが返される場合は常にSQLSMINTです。
パラメータ付き問い合わせでSQLDA
が使用される時、データは集合型にしたがって扱われます。
sqlilen
#NULL指示子データの長さです。
sqlxid
#
フィールドの拡張型で、PQftype
の結果です。
sqltypename
sqltypelen
sqlownerlen
sqlsourcetype
sqlownername
sqlsourceid
sqlflags
sqlreserved
#未使用です。
sqlilongdata
#
sqllen
が32キロバイトより大きい場合sqldata
と同じです。
以下に例を示します。
EXEC SQL INCLUDE sqlda.h; sqlda_t *sqlda; /* これは埋め込まれたDECLARE SECTIONの中にある必要はない */ EXEC SQL BEGIN DECLARE SECTION; char *prep_stmt = "select * from table1"; int i; EXEC SQL END DECLARE SECTION; ... EXEC SQL PREPARE mystmt FROM :prep_stmt; EXEC SQL DESCRIBE mystmt INTO sqlda; printf("# of fields: %d\n", sqlda->sqld); for (i = 0; i < sqlda->sqld; i++) printf("field %d: \"%s\"\n", sqlda->sqlvar[i]->sqlname); EXEC SQL DECLARE mycursor CURSOR FOR mystmt; EXEC SQL OPEN mycursor; EXEC SQL WHENEVER NOT FOUND GOTO out; while (1) { EXEC SQL FETCH mycursor USING sqlda; } EXEC SQL CLOSE mycursor; free(sqlda); /* 主な構造体はすべてfree()される、 * sqldaとsqlda->sqlvarは1つの割り当て領域内にある */
より詳細についてはsqlda.h
ヘッダファイルとsrc/interfaces/ecpg/test/compat_informix/sqlda.pgc
リグレッションテストを参照してください。
decadd
#2つのdecimal型変数を加算します。
int decadd(decimal *arg1, decimal *arg2, decimal *sum);
この関数は、decimal型の最初の演算項目(arg1
)へのポインタ、decimal型の2番目の演算項目(arg2
)へのポインタ、加算結果を格納するdecimal型値(sum
)へのポインタを受付けます。
成功すると、この関数は0を返します。
オーバーフローが発生した場合はECPG_INFORMIX_NUM_OVERFLOW
が、アンダーフローの場合はECPG_INFORMIX_NUM_UNDERFLOW
が返ります。
この他の失敗が発生した場合は-1が返り、errno
にはpgtypeslibにおける対応するerrno
番号が設定されます。
deccmp
#2つのdecimal型変数を比較します。
int deccmp(decimal *arg1, decimal *arg2);
この関数は、最初のdecimal値(arg1
)へのポインタ、2番目のdecimal値(arg2
)へのポインタを受付け、どちらが大きいかを示すint値を返します。
arg1
が指し示す値がarg2
が指し示す値より大きければ1。
arg1
が指し示す値がarg2
が指し示す値より小さければ-1。
arg1
が指し示す値とarg2
が指し示す値が同じならば0。
deccopy
#decimal値をコピーします。
void deccopy(decimal *src, decimal *target);
この関数は、最初の引数としてコピー元のdecimal値(src
)へのポインタ、2番目の引数としてdecimal型のコピー先構造体(target
)へのポインタを受付けます。
deccvasc
#ASCII表現からdecimal型に値を変換します。
int deccvasc(char *cp, int len, decimal *np);
この関数は、変換対象の文字列表現を持つ文字列(cp
)へのポインタとその文字列長len
を受付けます。
np
はこの操作結果を格納するdecimal型の値へのポインタです。
有効な書式の例は以下の通りです。
-2
、
.794
、
+3.44
、
592.49E07
、
-32.84e-4
。
この関数は成功時0を返します。
オーバーフローやアンダーフローが発生した場合はECPG_INFORMIX_NUM_OVERFLOW
やECPG_INFORMIX_NUM_UNDERFLOW
が返されます。
ASCII表現の解析ができなかった場合はECPG_INFORMIX_BAD_NUMERIC
が、指数部分の解析に問題がある場合はECPG_INFORMIX_BAD_EXPONENT
が返されます。
deccvdbl
#double型の値をdecimal型の値に変換します。
int deccvdbl(double dbl, decimal *np);
この関数は、最初の引数として変換対象のdouble型の変数(dbl
)を受付けます。
2番目の引数(np
)として、この関数は操作結果を格納するdecimal型変数へのポインタを受付けます。
この関数は成功時に0を返します。 変換が失敗した場合は負の値が返ります。
deccvint
#int型の値をdecimal型の値に変換します。
int deccvint(int in, decimal *np);
この関数は最初の引数として、変換対象のint型変数(in
)を受付けます。
2番目の引数(np
)として、この関数は変換結果を格納するdecimal型変数へのポインタを受付けます。
この関数は成功時に0を返します。 変換が失敗した場合は負の値が返ります。
deccvlong
#long型の値をdecimal型の値に変換します。
int deccvlong(long lng, decimal *np);
この関数は最初の引数として、変換対象のlong型変数(lng
)を受付けます。
2番目の引数(np
)として、この関数は変換結果を格納するdecimal型変数へのポインタを受付けます。
この関数は成功時に0を返します。 変換が失敗した場合は負の値が返ります。
decdiv
#2つのdecimal型変数の除算を行います。
int decdiv(decimal *n1, decimal *n2, decimal *result);
この関数は、1番目の演算項目(n1
)と2番目の演算項目(n2
)となる変数のポインタを受付け、n1
/n2
を計算します。
result
は、操作結果を格納する変数へのポインタです。
成功時0が返され、除算の失敗時には負の値が返されます。
オーバーフローやアンダーフローが発生した場合、この関数はそれぞれECPG_INFORMIX_NUM_OVERFLOW
、ECPG_INFORMIX_NUM_UNDERFLOW
を返します。
0割りが発生した場合はECPG_INFORMIX_DIVIDE_ZERO
が返されます。
decmul
#2つのdecimal型変数を乗算します。
int decmul(decimal *n1, decimal *n2, decimal *result);
この関数は、1番目の演算項目(n1
)と2番目の演算項目(n2
)となる変数のポインタを受付け、n1
*n2
を計算します。
result
は、操作結果を格納する変数へのポインタです。
成功時0が返され、乗算の失敗時には負の値が返されます。
オーバーフローやアンダーフローが発生した場合、この関数はそれぞれECPG_INFORMIX_NUM_OVERFLOW
、ECPG_INFORMIX_NUM_UNDERFLOW
を返します。
decsub
#decimal型の値同士の引算を行います。
int decsub(decimal *n1, decimal *n2, decimal *result);
この関数は、1番目の演算項目(n1
)と2番目の演算項目(n2
)となる変数のポインタを受付け、n1
-n2
を計算します。
result
は、操作結果を格納する変数へのポインタです。
成功時0が返され、減算の失敗時には負の値が返されます。
オーバーフローやアンダーフローが発生した場合、この関数はそれぞれECPG_INFORMIX_NUM_OVERFLOW
、ECPG_INFORMIX_NUM_UNDERFLOW
を返します。
dectoasc
#decimal型変数をC char* 文字列のASCII表現に変換します。
int dectoasc(decimal *np, char *cp, int len, int right)
この関数はdecimal型変数(np
)のポインタを受け付け、テキスト表現に変換します。
cp
は変換結果を格納するためのバッファです。
right
パラメータは、10進小数点の右側の何桁を出力するかを指定します。
結果はこの10進桁数で丸められます。
right
を-1にすることで、すべての有効な桁数が出力されるようになります。
len
で示す出力バッファ長が、最後のNULL文字を含むテキスト表現を格納するのには不十分であった場合、結果には*
という1文字が格納され、-1が返されます。
この関数は、cp
バッファが小さすぎる場合に-1を返します。
メモリ不足の場合はECPG_INFORMIX_OUT_OF_MEMORY
を返します。
dectodbl
#decimal型変数をdoubleに変換します。
int dectodbl(decimal *np, double *dblp);
この関数は変換対象のdecimal型変数(np
)のポインタと処理結果を格納するdouble変数(dblp
)へのポインタを受け付けます。
成功時0が、変換失敗時負の値が返されます。
dectoint
#decimal型変数をinteger型に変換します。
int dectoint(decimal *np, int *ip);
この関数は変換対象のdecimal型変数(np
)のポインタと処理結果を格納するinteger型変数(ip
)へのポインタを受け付けます。
成功時0が、変換失敗時負の値が返されます。
オーバーフローが発生した場合はECPG_INFORMIX_NUM_OVERFLOW
が返されます。
このECPGの実装はInformixの実装と異なることに注意してください。
Informixでは、integer範囲に-32767から32767までという制限をしていますが、ECPGでの制限はアーキテクチャに依存(INT_MIN .. INT_MAX
)します。
dectolong
#decimal型変数をlong integer型に変換します。
int dectolong(decimal *np, long *lngp);
この関数は変換対象のdecimal型変数(np
)のポインタと処理結果を格納するlong変数(lngp
)へのポインタを受け付けます。
成功時0が、変換失敗時負の値が返されます。
オーバーフローが発生した場合はECPG_INFORMIX_NUM_OVERFLOW
が返されます。
このECPGの実装はInformixの実装と異なることに注意してください。
Informixでは、long integer範囲に-2,147,483,647から2,147,483,647までという制限をしていますが、ECPGでの制限はアーキテクチャに依存(-LONG_MAX .. LONG_MAX
)します。
rdatestr
#date型をC char*文字列に変換します。
int rdatestr(date d, char *str);
この関数は2つの引数を受付けます。
最初の引数は変換対象のdate型(d
)、2番目は変換後の文字列へのポインタです。
出力書式は常にyyyy-mm-dd
ですので、少なくとも11文字(NULL終端を含む)を結果文字列に割り当てなければなりません。
この関数は成功時0を、エラー時負の値を返します。
このECPGの実装はInformixの実装と異なることに注意してください。 Informixでは、環境変数により書式を変更できますが、ECPGでは出力書式を変更することはできません。
rstrdate
#date型のテキスト表現を解析します。
int rstrdate(char *str, date *d);
この関数は、変換対象のdate型のテキスト表現(str
)とdate型変数のポインタ(d
)を受付けます。
この関数では書式マスクを指定することができません。
Informixのデフォルトの書式マスクであるmm/dd/yyyy
を使用します。
内部的には、この関数はrdefmtdate
を使用して実装しています。
したがってrstrdate
は速くありません。
もし選択肢があるのであれば、書式マスクを明示的に指定することができるrdefmtdate
を選択すべきです。
この関数はrdefmtdate
と同様の値を返します。
rtoday
#現在の日付を(date型で)入手します。
void rtoday(date *d);
この関数はdate型変数(d
)へのポインタを受付け、そこに現在の日付を格納します。
内部的には、この関数はPGTYPESdate_today
関数を使用します。
rjulmdy
#date型変数から、日、月、年の値を取り出します。
int rjulmdy(date d, short mdy[3]);
この関数は日付d
、3つのshort integer型の値からなる配列mdy
へのポインタを受付けます。
この変数名はその並びを表し、mdy[0]
には月数、mdy[1]
には日数が、mdy[2]
には年が入ります。
現在この関数は常に0を返します。
内部的にはこの関数はPGTYPESdate_julmdy
関数を使用します。
rdefmtdate
#書式マスクを使用して、文字列をdate型の値に変換します。
int rdefmtdate(date *d, char *fmt, char *str);
この関数は、処理結果を格納するためのdate型へのポインタ(d
)、日付を解析するための書式マスク(fmt
)、dateのテキスト表現を含むCのchar*文字列(str
)を受付けます。
テキスト表現は書式マスクに合った表現であることが仮定されています。
しかし、文字列と書式マスクを1:1に対応付けする必要はありません。
この関数は並んだ順番に解析し、年の位置を表すyy
またはyyyy
を、月の位置を表すmm
を、日の位置を表すdd
を検索します。
この関数は以下の値を返します。
0 - 関数が正常に終了しました。
ECPG_INFORMIX_ENOSHORTDATE
- 日付に、日、月、年を区切る文字がありませんでした。
この場合、入力文字列は6バイト、8バイトのいずれかでなければなりませんが、そうではありませんでした。
ECPG_INFORMIX_ENOTDMY
- 書式文字列が正しく年月日の順番を示していません。
ECPG_INFORMIX_BAD_DAY
- 入力文字列に有効な日が含まれていません。
ECPG_INFORMIX_BAD_MONTH
- 入力文字列に有効な月が含まれていません。
ECPG_INFORMIX_BAD_YEAR
- 入力文字列に有効な年が含まれていません。
内部的には、この関数はPGTYPESdate_defmt_asc
関数を使用して実装しています。
この関数の説明には、入力例の表がありますので、こちらも参照してください。
rfmtdate
#書式マスクを使用してdate型変数をテキスト表現に変換します。
int rfmtdate(date d, char *fmt, char *str);
この関数は変換対象の日付(d
)、書式マスク(fmt
)、日付のテキスト表現を格納する文字列(str
)を受付けます。
成功時0、エラーが発生した場合は負の値が返されます。
内部的にはこの関数はPGTYPESdate_fmt_asc
関数を使用します。
例が記載されていますので、こちらも参照してください。
rmdyjul
#日付の日、月、年を表す3つのshort integer型からなる配列から日付型の値を作成します。
int rmdyjul(short mdy[3], date *d);
この関数は3つのshort integer型からなる配列(mdy
)と処理結果を格納するdate型変数へのポインタを受付けます。
現在この関数は常に0を返します。
内部的にはこの関数はPGTYPESdate_mdyjul
関数を使用して実装しています。
rdayofweek
#日付型の値の週内日数を示す値を返します。
int rdayofweek(date d);
この関数はdate型変数d
をその唯一の引数として受付け、その日付の週内日数を示す整数を返します。
0 - 日曜
1 - 月曜
2 - 火曜
3 - 水曜
4 - 木曜
5 - 金曜
6 - 土曜
内部的にはこの関数は PGTYPESdate_dayofweek
関数を使用して実装しています。
dtcurrent
#現在のタイムスタンプを取り出します。
void dtcurrent(timestamp *ts);
この関数は現在のタイムスタンプを受け取り、ts
が指し示すタイムスタンプ型変数に格納します。
dtcvasc
#テキスト表現からtimestamp型変数にタイムスタンプを解析します。
int dtcvasc(char *str, timestamp *ts);
この関数は対象の文字列(str
)と処理結果を格納するtimestamp型変数(ts
)へのポインタを受付けます。
この関数は成功時0を返し、エラー時負の値を返します。
内部的にはこの関数はPGTYPEStimestamp_from_asc
関数を使用します。
入力例の表がありますので、こちらも参照してください。
dtcvfmtasc
#書式マスクを使用してタイムスタンプのテキスト表現をtimestamp型変数に変換します。
dtcvfmtasc(char *inbuf, char *fmtstr, timestamp *dtvalue)
この関数は、対象とする文字列(inbuf
)、使用する書式マスク(fmtstr
)、処理結果を格納するtimestamp変数(dtvalue
)へのポインタを受付けます。
この関数はPGTYPEStimestamp_defmt_asc
関数を使用して実装されています。
使用可能な書式指定のリストがありますので、こちらも参照してください。
この関数は成功時に0を、エラー時負の値を返します。
dtsub
#timestamp型同士で減算を行い、interval型変数を返します。
int dtsub(timestamp *ts1, timestamp *ts2, interval *iv);
この関数はts1
が指し示すtimestamp型変数からts2
が指し示すtimestamp型変数を引きます。
結果はiv
が指し示すinterval型変数に格納されます。
成功時この関数は0を返し、エラー時負の値を返します。
dttoasc
#timestamp型変数をC char*文字列に変換します。
int dttoasc(timestamp *ts, char *output);
この関数は対象のtimestamp型変数(ts
)へのポインタ、処理結果を格納する文字列(output
)を受付けます。
これはts
を標準SQLに従うテキスト表現(YYYY-MM-DD HH:MM:SS
として定義)に変換します。
成功時この関数は0を返し、エラー時負の値を返します。
dttofmtasc
#書式マスクを使用してtimestamp型変数をC char*に変換します。
int dttofmtasc(timestamp *ts, char *output, int str_len, char *fmtstr);
この関数は、最初の引数として変換対象のタイムスタンプ(ts
)を、出力バッファのポインタ(output
)、出力バッファで割当て可能な最大長 (str_len
)、変換に使用する書式マスク(fmtstr
)を受付けます。
成功時この関数は0を返します。エラーが発生した場合は負の値を返します。
内部的に、この関数はPGTYPEStimestamp_fmt_asc
関数を使用します。
使用できる書式マスクに関する情報がありますので、こちらも参照してください。
intoasc
#interval型変数をC char*文字列に変換します。
int intoasc(interval *i, char *str);
この関数は、変換対象のinterval型変数(i
)へのポインタ、処理結果を格納する文字列(str
)を受付けます。
これはi
を標準SQLに従うテキスト表現(YYYY-MM-DD HH:MM:SS
として定義)に変換します。
成功時、この関数は0を返します。 エラーが発生した場合は負の値を返します。
rfmtlong
#long integer値を書式マスクを使用してテキスト表現に変換します。
int rfmtlong(long lng_val, char *fmt, char *outbuf);
この関数は、long型の値lng_val
、書式マスクfmt
、出力バッファoutbuf
へのポインタを受付けます。
これはlong型の値を書式マスクに従ってテキスト表現に変換します。
書式マスクは以下の書式指定文字を組み合わせることができます。
*
(アスタリスク) - この位置が空白ならばアスタリスクで埋めます。
&
(アンパサンド) - この位置が空白ならば0で埋めます。
#
- 先頭のゼロを空白に変換します。
<
- 文字列内で数値を左そろえします。
,
(カンマ) - 4桁以上の数値をカンマで区切った3桁にグループ化します。
.
(ピリオド) - この文字は数値から小数部分を区別します。
-
(マイナス) - 数値が負の場合、マイナス記号を付けます。
+
(プラス) - 数値が正の場合プラス記号を付けます。
(
- これは負の値の先頭のマイナス記号を置き換えます。
マイナス記号は現れません。
)
- この文字はマイナス記号を置き換え、負の値の最後に出力します。
$
- 通貨記号
rupshift
#文字列を大文字に変換します。
void rupshift(char *str);
この関数は文字列へのポインタを受付け、すべての小文字を大文字に変換します。
byleng
#文字列内の文字数を返します。 ただし、末尾の空白は数えません。
int byleng(char *str, int len);
この関数は最初の引数として、固定長の文字列(str
)を、2番目の引数としてその文字列長 (len
)想定しています。
これは、文字列から末尾の空白を取り除いた、有効文字の数を返します。
ldchar
#固定長の文字列をNULL終端の文字列に複製します。
void ldchar(char *src, int len, char *dest);
この関数はコピー対象の固定長の文字列(src
)、文字列長(len
)、格納先メモリ(dest
)へのポインタを受付けます。
dest
が指し示す文字列には少なくともlen+1
バイトを割り当てなければならない点に注意してください。
この関数は多くてもlen
バイトを新しい場所にコピーします。
(元の文字列が末尾に空白文字を持つ場合に少なくなります。)
そして、NULL終端を付与します。
rgetmsg
#
int rgetmsg(int msgnum, char *s, int maxsize);
この関数は存在しますが、現在実装されていません。
rtypalign
#
int rtypalign(int offset, int type);
この関数は存在しますが、現在実装されていません。
rtypmsize
#
int rtypmsize(int type, int len);
この関数は存在しますが、現在実装されていません。
rtypwidth
#
int rtypwidth(int sqltype, int sqllen);
この関数は存在しますが、現在実装されていません。
rsetnull
#変数にNULLを設定します。
int rsetnull(int t, char *ptr);
この関数は、変数の種類を示す整数とC char*にキャストした変数自体へのポインタを受付けます。
以下の種類が存在します。
CCHARTYPE
- char
または char*
型の変数用
CSHORTTYPE
- short int
型の変数用
CINTTYPE
- int
型の変数用
CBOOLTYPE
- boolean
型の変数用
CFLOATTYPE
- float
型の変数用
CLONGTYPE
- long
型の変数用
CDOUBLETYPE
- double
型の変数用
CDECIMALTYPE
- decimal
型の変数用
CDATETYPE
- date
型の変数用
CDTIMETYPE
- timestamp
型の変数用
以下にこの関数の呼び出し例を示します。
$char c[] = "abc "; $short s = 17; $int i = -74874; rsetnull(CCHARTYPE, (char *) c); rsetnull(CSHORTTYPE, (char *) &s); rsetnull(CINTTYPE, (char *) &i);
risnull
#変数がNULLか検査します。
int risnull(int t, char *ptr);
この関数は検査する変数の種類(t
)、変数(ptr
)へのポインタを受付けます。
後者はchar*にキャストする必要があることに注意してください。
取り得る変数種類については rsetnull
関数を参照してください。
この関数の使用方法の例を示します。
$char c[] = "abc "; $short s = 17; $int i = -74874; risnull(CCHARTYPE, (char *) c); risnull(CSHORTTYPE, (char *) &s); risnull(CINTTYPE, (char *) &i);
ここで示す定数はすべてエラーを示すものであり、負の値を表すように定義されていることに注意してください。 また、他の定数の説明では、現在の実装で定数が表す数値がわかります。 しかし、この数値に依存してはなりません。 しかし、これらのすべてが負の値であることに依存することは可能です。
ECPG_INFORMIX_NUM_OVERFLOW
#計算時にオーバーフローが発生した場合、関数はこの値を返します。 内部的には-1200(Informixの定義)と定義されています。
ECPG_INFORMIX_NUM_UNDERFLOW
#計算時にアンダーフローが発生した場合、関数はこの値を返します。 内部的には-1201(Informixの定義)と定義されています。
ECPG_INFORMIX_DIVIDE_ZERO
#計算時にゼロ除算が発生した場合、関数はこの値を返します。 内部的には-1202(Informixの定義)と定義されています。
ECPG_INFORMIX_BAD_YEAR
#日付の解析時に年の値が不正であった場合、関数はこの値を返します。 内部的には-1204(Informixの定義)と定義されています。
ECPG_INFORMIX_BAD_MONTH
#日付の解析時に月の値が不正であった場合、関数はこの値を返します。 内部的には-1205(Informixの定義)と定義されています。
ECPG_INFORMIX_BAD_DAY
#日付の解析時に日の値が不正であった場合、関数はこの値を返します。 内部的には-1206(Informixの定義)と定義されています。
ECPG_INFORMIX_ENOSHORTDATE
#解析処理が短縮日付表現を必要としているが、正しい長さの日付文字列が得られなかった場合、関数はこの値を返します。 内部的には-1209(Informixの定義)と定義されています。
ECPG_INFORMIX_DATE_CONVERT
#日付の書式付けの時にエラーが発生した場合、関数はこの値を返します。 内部的には-1210(Informixの定義)と定義されています。
ECPG_INFORMIX_OUT_OF_MEMORY
#操作時にメモリが不足した場合、関数はこの値を返します。 内部的には-1211(Informixの定義)と定義されています。
ECPG_INFORMIX_ENOTDMY
#
解析処理が書式マスク(mmddyy
のような)が存在することを前提としているが、すべてのフィールドが正しく列挙されていない場合、関数はこの値を返します。
内部的には-1212(Informixの定義)と定義されています。
ECPG_INFORMIX_BAD_NUMERIC
#解析処理がエラーのため数値のテキスト表現を解析できなかった場合や数値変数の少なくとも1つが無効のため数値変数を使用した計算を完了できなかった場合、関数はこの値を返します。 内部的には-1213(Informixの定義)と定義されています。
ECPG_INFORMIX_BAD_EXPONENT
#解析処理が指数の解析を行うことができなかった場合、関数はこの値を返します。 内部的には-1216(Informixの定義)と定義されています。
ECPG_INFORMIX_BAD_DATE
#解析処理が日付を解析できなかった場合、関数はこの値を返します。 内部的には-1218(Informixの定義)と定義されています。
ECPG_INFORMIX_EXTRA_CHARS
#解析処理が追加の文字列を解析できなかった場合、関数はこの値を返します。 内部的には-1264(Informixの定義)と定義されています。