EXEC SQL INSERT時のホスト変数に関して
いつもお世話になります。今回は静的SQLに関して質問です。
次のファイルがあるとします(DB2使用)。
■レイアウト
FILEA
フィールド 桁数 属性
1. FLD010 5 A
2. FLD020 7 A
3. FLD030 1 A
■プログラム(簡略)
EXEC SQL INCLUDE SQLCA;
EXEC SQL BEGIN DECLARE SECTION;
struct DEF_FILE_A
{
char fld010[6];
char fld020[8];
char fld030[2];
} a;
EXEC SQL DECLARE c1 CURSOR FOR
SELECT FLD010, FLD020, FLD030 FROM XXXXXX
EXEC SQL OPEN c1;
EXEC SQL FETCH c1 INTO :a.fld010, a.fld020, a.fld030;
(中略)
EXEC SQL CLOSE c1;
問題なのはSQLコーディング上のホスト変数に関してです。
上記のstruct DEF_FILE_Aの記述のように、実際のファイルの
フィールド長に+1した長さの定義をして(NULL値が入るから)記述しています。これにより、fld010~fld030の値には正しい結果が、
FETCHで入ってきています。
ところが同じように、このファイルに挿入する場合に
下記のように記述しました。
EXEC SQL INSERT
INTO XXXXXX(FLD010, FLD020, FLD030)
VALUES
(
:a.fld010,
:a.fld020,
:a.fld030
);
を、実行しますと、SQLCODEには-433(Value is too long)が
入ってきて、INSERTされません。別に実行時にエラーで落ちたりはしませんが、結果として何も挿入されません。
試しに、ファイルレイアウトと同じ桁数の別のホスト変数を
定義して試してみました。結果はOKでした。
皆さんにお聞きしたいのは、SQLの記述では、入力時は
+1桁したホスト変数で受け、更新や挿入時にはファイルレイアウト
と同じ桁数で定義した別のホスト変数を定義しないといけないのでしょうか?
それとも、根本的に間違った解釈をしているでしょうか?
宜しくご教授頂きたく存じます。
お礼
こんな違いがあったんですね。 大変勉強になりました。 ありがとうございました!