• ベストアンサー

ProC 固定SQLでNULLってどう表現するの?

<テーブル> 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」は、どのような場合に発生するのでしょうか? 以上、回答お願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.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/
mas_sama
質問者

お礼

<最終結果> プログラム正常に動作いたしました。 ありがとうございます。m(_ _)m 原因は、ホスト変数にデータを設定する処理にありました。 例>  strcpy(hT1_C3.arr,"");  hT1_C3.len = 123; /* ←文字列長の設定に誤りがあった */  iT1_C3 = -1; 上記の処理そのままではありませんが、 ホスト変数の領域を逸脱するような、 文字列長を設定していたため、 今回のようなエラーが発生していました(^^;

mas_sama
質問者

補足

<訂正> 補足欄の表記に誤りがありました。 (誤)hT1_C3.arr = "" (正)strcpy(hT1_C3.arr, ""); <リファレンスより抜粋> ORA-01458 可変長文字列の長さが無効です。 原因:可変長文字列をバインドまたは定義していますが、    バッファ長が必要最低限の長さより小さくなっています。 処置:バッファ・サイズを大きくするか、他のデータ型を使用してください。 <疑問> 「可変長文字列の長さ」は、おそらく「hT1_C3.len」だと思うのですが、 「バッファ長」、「バッファサイズ」とはなんのことなのでしょう?(^^; <結果> ご指摘の方法でNULLをINSERTできるのですが、 やはりINSERTするデータによっては「ORA-01458」が発生するようです。 引き続き調査をしたいと思います。

その他の回答 (2)

  • madman
  • ベストアンサー率24% (612/2465)
回答No.2

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

mas_sama
質問者

お礼

無事解決いたしました。 ありがとうございます。m(_ _)m 結果の詳細はmuyoshidさんへのお礼の欄をご覧下さい。

mas_sama
質問者

補足

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

  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.1

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

mas_sama
質問者

お礼

無事解決いたしました。 ありがとうございます。m(_ _)m 結果の詳細はmuyoshidさんへのお礼の欄をご覧下さい。

mas_sama
質問者

補足

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