- ベストアンサー
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」は、どのような場合に発生するのでしょうか? 以上、回答お願いいたします。
- みんなの回答 (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/
その他の回答 (2)
- madman
- ベストアンサー率24% (612/2465)
VARCHAR hT1_C3[8]; は展開すると struct { int len char arr[8]; } ; になります。 そのまま代入しちゃダメです。 せめて hT1_C3.arr[0] = 0x00; とでもしましょう。
お礼
無事解決いたしました。 ありがとうございます。m(_ _)m 結果の詳細はmuyoshidさんへのお礼の欄をご覧下さい。
補足
<訂正> 補足欄の表記に誤りがありました。 (誤)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)
"" じゃなくて 直接 Null と入れるのだと思います。 hT1_C3.arr =Null;
お礼
無事解決いたしました。 ありがとうございます。m(_ _)m 結果の詳細はmuyoshidさんへのお礼の欄をご覧下さい。
補足
<訂正> 補足欄の表記に誤りがありました。 (誤)hT1_C3.arr = "" (正)strcpy(hT1_C3.arr, ""); <結果> ご指摘の通りです。 hT1_C3.arr = ""; ↓ hT1_C3.arr = "\0"; ↓ hT1_C3.arr = 0x00; ↓ hT1_C3.arr = Null; Nullポインタを代入しているように見えてしまいますね(^^; C言語の経験が浅いため省略して表記したため、 誤った表記になっていました。
お礼
<最終結果> プログラム正常に動作いたしました。 ありがとうございます。m(_ _)m 原因は、ホスト変数にデータを設定する処理にありました。 例> strcpy(hT1_C3.arr,""); hT1_C3.len = 123; /* ←文字列長の設定に誤りがあった */ iT1_C3 = -1; 上記の処理そのままではありませんが、 ホスト変数の領域を逸脱するような、 文字列長を設定していたため、 今回のようなエラーが発生していました(^^;
補足
<訂正> 補足欄の表記に誤りがありました。 (誤)hT1_C3.arr = "" (正)strcpy(hT1_C3.arr, ""); <リファレンスより抜粋> ORA-01458 可変長文字列の長さが無効です。 原因:可変長文字列をバインドまたは定義していますが、 バッファ長が必要最低限の長さより小さくなっています。 処置:バッファ・サイズを大きくするか、他のデータ型を使用してください。 <疑問> 「可変長文字列の長さ」は、おそらく「hT1_C3.len」だと思うのですが、 「バッファ長」、「バッファサイズ」とはなんのことなのでしょう?(^^; <結果> ご指摘の方法でNULLをINSERTできるのですが、 やはりINSERTするデータによっては「ORA-01458」が発生するようです。 引き続き調査をしたいと思います。