プロが教える店舗&オフィスのセキュリティ対策術

いつもお世話になります。今回は静的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桁したホスト変数で受け、更新や挿入時にはファイルレイアウト
と同じ桁数で定義した別のホスト変数を定義しないといけないのでしょうか?
それとも、根本的に間違った解釈をしているでしょうか?
宜しくご教授頂きたく存じます。

A 回答 (1件)

NULL値の受け渡しには、標識変数を使います。

    • good
    • 0
この回答へのお礼

ご連絡ありがとうございました。
「標識変数」、利用する機会がありましたら、使ってみます。
説明不足ですみません。
文中の、「フィールド長に+1した長さの定義をして(NULL値が入るから)」は、+1した理由が、文字列の最後にNULLが入った状態で、ホスト変数に取り込むためという意味でした。
INSERT時に、+1したホスト変数をそのまま、VALUESに指定して実行するとエラーになります。しかし、+1しない(つまりDB定義と同じ桁数のホスト変数を別に定義して、実行すると正常に実行されるのです。
皆さんがどのようにされているかお聞きしたかったしだいです。
また何か、ございましたら、ご教授ください。
宜しくお願いします。

お礼日時:2006/11/27 10:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す