dポイントプレゼントキャンペーン実施中!

<テーブル>
T1 C1 VARCHAR2(7) NOTNULL
  C2 NUMBER(13)
  C3 VARCHAR2(8)
<プログラム>
VARCHAR hT1_C1[7];
VARCHAR hT1_C2[13+1];
VARCHAR hT1_C3[8];
short iT1_C1;
short iT1_C2;
short iT1_C3;

EXEC SQL
INSERT INTO T1 (
T1.C1,
T1.C2,
T1.C3
)
VALUES (
:hT1_C1 INDICATOR :iT1_C1,
TO_NUMBER(:hT1_C2),
:hT1_C3 INDICATOR :iT1_C3
)
;
<事象>
SQLエラー[-1485]が発生
<補足>
C1、C2はNULL以外の値を設定。
C3はNULLを設定。
hT1_C3.arr = "";
hT1_C3.len = 0;
iT1_C3 = -1;
<質問>
1、NULLの設定方法が間違っているのでしょうか?
2、上記プログラムの「EXECSQL~」の部分を変更せずに解消する方法はあるのでしょうか?
3、SQLエラーコード「-1458」は、どのような場合に発生するのでしょうか?

以上、回答お願いいたします。

A 回答 (3件)

こんにちわ。



NULL をInsert する方法ですが、
strcpy(hT1_C3.arr, ""); hT1_C3.len = 0; iT1_C3 = -1;
としておいて、Insert すればOk の筈です。
※ hT1_C1, hT1_C3 変数についてですが、NULL 文字を入れるための
領域も併せて確保しておいた方が、扱いが楽になると思いますょ。

ユーザ登録 (無料) が必要ですが、OTN Japan にPDF 形式でマニュアル
が公開されていますので、こちらからDownload されてはいかがでしょうか?
標識変数の使い方については、「Pro*C/C++ Precompiler プログラマーズ・ガイド」
に説明があります。

参考URL:http://technet.oracle.co.jp/

この回答への補足

<訂正>
補足欄の表記に誤りがありました。
(誤)hT1_C3.arr = ""
(正)strcpy(hT1_C3.arr, "");

<リファレンスより抜粋>
ORA-01458 可変長文字列の長さが無効です。
原因:可変長文字列をバインドまたは定義していますが、
   バッファ長が必要最低限の長さより小さくなっています。
処置:バッファ・サイズを大きくするか、他のデータ型を使用してください。

<疑問>
「可変長文字列の長さ」は、おそらく「hT1_C3.len」だと思うのですが、
「バッファ長」、「バッファサイズ」とはなんのことなのでしょう?(^^;

<結果>
ご指摘の方法でNULLをINSERTできるのですが、
やはりINSERTするデータによっては「ORA-01458」が発生するようです。
引き続き調査をしたいと思います。

補足日時:2003/01/22 16:33
    • good
    • 0
この回答へのお礼

<最終結果>
プログラム正常に動作いたしました。
ありがとうございます。m(_ _)m
原因は、ホスト変数にデータを設定する処理にありました。

例>
 strcpy(hT1_C3.arr,"");
 hT1_C3.len = 123; /* ←文字列長の設定に誤りがあった */
 iT1_C3 = -1;

上記の処理そのままではありませんが、
ホスト変数の領域を逸脱するような、
文字列長を設定していたため、
今回のようなエラーが発生していました(^^;

お礼日時:2003/01/23 02:34

VARCHAR hT1_C3[8];


は展開すると
struct
{
int len
char arr[8];
} ;
になります。
そのまま代入しちゃダメです。
せめて
hT1_C3.arr[0] = 0x00;
とでもしましょう。

この回答への補足

<訂正>
補足欄の表記に誤りがありました。
(誤)hT1_C3.arr = ""
(正)strcpy(hT1_C3.arr, "");

<結果>
ご指摘の通りです。
hT1_C3.arr = "";
   ↓
hT1_C3.arr = "\0";
   ↓
hT1_C3.arr = 0x00;
   ↓
hT1_C3.arr = Null;
Nullポインタを代入しているように見えてしまいますね(^^;
C言語の経験が浅いため省略して表記したため、
誤った表記になっていました。

補足日時:2003/01/22 16:48
    • good
    • 0
この回答へのお礼

無事解決いたしました。
ありがとうございます。m(_ _)m

結果の詳細はmuyoshidさんへのお礼の欄をご覧下さい。

お礼日時:2003/01/23 02:36

"" じゃなくて 直接 Null と入れるのだと思います。



hT1_C3.arr =Null;

この回答への補足

<訂正>
補足欄の表記に誤りがありました。
(誤)hT1_C3.arr = ""
(正)strcpy(hT1_C3.arr, "");

<結果>
ご指摘の通りです。
hT1_C3.arr = "";
   ↓
hT1_C3.arr = "\0";
   ↓
hT1_C3.arr = 0x00;
   ↓
hT1_C3.arr = Null;
Nullポインタを代入しているように見えてしまいますね(^^;
C言語の経験が浅いため省略して表記したため、
誤った表記になっていました。

補足日時:2003/01/22 16:52
    • good
    • 1
この回答へのお礼

無事解決いたしました。
ありがとうございます。m(_ _)m

結果の詳細はmuyoshidさんへのお礼の欄をご覧下さい。

お礼日時:2003/01/23 02:36

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