某プロジェクトのお手伝いで10年ぶりくらいに Oracle Pro*C/C++ (proc) でプログラムをつくりました。
それでちょっとはまったのが、動的にメモリを確保して、そこに数行分のデータを一気に読み込むロジックです。
設計は以下のとおり。
1.構造体の定義
2.メモリの確保
3.カーソルの定義
4.フェッチ
書いたコードの抜粋は以下
typedef struct { char name[15]; int age; } PERSON; int limit = 100; PERSON *p; p = malloc(sizeof(PERSON) * 100); EXEC SQL DECLARE c CURSOR FOR SELECT ...... ; EXEC SQL FOR :limit FETCH c INTO :p;
(答え)構造体の定義で struct に構造体タグをつけ忘れたこと
(誤) typedef struct { char name[15]; int age; } PERSON; (正) typedef struct _person { char name[15]; int age; } PERSON; or struct _person { charname[15]; int age; };
コンパイルエラーは出ないがNG
配列のサイズ計算がうまく行えず、バッファ内がぐちゃぐちゃに。(プログラマーズガイド「構造体の配列の宣言」)
次に読み取り行数の認識間違い。
問題は100件読み取ってもまだ続きがあるときの 2回目の FETCH での行数 sqlca.sqlerrd[2] の値。
処理した行数ではなくて、累積数が記録されているってこと。
ちゃんとマニュアル読めばわかる話だけど、記憶だけ書いちゃうとだめな例(同 ガイド「sqlca.sqlerrd[2]の使用方法」)
コメント