
<テーブル>
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」は、どのような場合に発生するのでしょうか?
以上、回答お願いいたします。
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/
この回答への補足
<訂正>
補足欄の表記に誤りがありました。
(誤)hT1_C3.arr = ""
(正)strcpy(hT1_C3.arr, "");
<リファレンスより抜粋>
ORA-01458 可変長文字列の長さが無効です。
原因:可変長文字列をバインドまたは定義していますが、
バッファ長が必要最低限の長さより小さくなっています。
処置:バッファ・サイズを大きくするか、他のデータ型を使用してください。
<疑問>
「可変長文字列の長さ」は、おそらく「hT1_C3.len」だと思うのですが、
「バッファ長」、「バッファサイズ」とはなんのことなのでしょう?(^^;
<結果>
ご指摘の方法でNULLをINSERTできるのですが、
やはりINSERTするデータによっては「ORA-01458」が発生するようです。
引き続き調査をしたいと思います。
<最終結果>
プログラム正常に動作いたしました。
ありがとうございます。m(_ _)m
原因は、ホスト変数にデータを設定する処理にありました。
例>
strcpy(hT1_C3.arr,"");
hT1_C3.len = 123; /* ←文字列長の設定に誤りがあった */
iT1_C3 = -1;
上記の処理そのままではありませんが、
ホスト変数の領域を逸脱するような、
文字列長を設定していたため、
今回のようなエラーが発生していました(^^;
No.2
- 回答日時:
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言語の経験が浅いため省略して表記したため、
誤った表記になっていました。
No.1
- 回答日時:
"" じゃなくて 直接 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言語の経験が浅いため省略して表記したため、
誤った表記になっていました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JCLの基本について教えてください
-
変数の値が勝手に変化する原因
-
360度を超える角度
-
COBOLのピリオド
-
ファイルの開き方
-
あるプログラムのコマンドライ...
-
正しい五十音順について
-
65536は2の何乗なのでしょうか?
-
VBAにてメール作成した際、一部...
-
VBAで仕様書は書きますか?
-
Vba UserFormを前面に出す方法...
-
寿命
-
COBOLでBLOCK CONTAINS句につい...
-
OS入ってる機器のソフト・アプ...
-
変化させるセルが変化しない
-
空elseの有無
-
C++でアボート(Abort)で処理が...
-
自動クエリとはどういうもので...
-
グループを均等に分けるには?...
-
「Outlookが他のプログラムによ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【JAVA】数字をひし形に出力す...
-
変数の値が勝手に変化する原因
-
COBOLのピリオド
-
C言語 バッファについて。
-
Sublime Text 3でのFortranプロ...
-
360度を超える角度
-
fortran if文
-
VBAで試験項目の条件規格を取り...
-
c言語プログラミング
-
Fortran "実引数の型が仮引数の...
-
Matlabについて質問2
-
Javaの配列プログラムについて
-
N88basicを用いたGPIB制御
-
ruby
-
プログラミング(自由課題)
-
JCLの基本について教えてください
-
main関数終了時のreturnの意味は?
-
プログラミング
-
3つの整数のうち奇数のみを表示...
-
カシオ fx-5800P 測量プログラ...
おすすめ情報