PR

Oracle Pro*C/C++ での構造体配列のポインタ

某プロジェクトのお手伝いで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;
};

コンパイルエラーは出ないがNGsign03

配列のサイズ計算がうまく行えず、バッファ内がぐちゃぐちゃに。(プログラマーズガイド「構造体の配列の宣言」)

次に読み取り行数の認識間違い。

問題は100件読み取ってもまだ続きがあるときの 2回目の FETCH での行数 sqlca.sqlerrd[2] の値。
処理した行数ではなくて、累積数が記録されているってこと。
ちゃんとマニュアル読めばわかる話だけど、記憶だけ書いちゃうとだめな例(同 ガイド「sqlca.sqlerrd[2]の使用方法」)

コメント

タイトルとURLをコピーしました