- ベストアンサー
ORA-06502のエラー
以下のPL/SQLを実行すると、ORA-06502:数値または値のエラーとでます。途中までは、INSERTできるのですが、IF文の180個目くらいでエラーになります。そのあたりをCur1の宣言時にWhereで指定するとうまくいきます。 DECLARE CURSOR Cur1 IS SELECT MOJI FROM A_TBL ; CNT NUMBER(10); KAKKO_FL NUMBER(1); BEGIN CNT := 0; KAKKO_FL :=0; FOR Cur_Rec1 IN Cur1 LOOP FOR S IN 1 .. LENGTH(Cur_Rec1.MOJI) LOOP IF(ASCII(SUBSTR(Cur_Rec1.MOJI,S,1)) = 33129) THEN /*33129は'('*/ EXECUTE IMMEDIATE ' INSERT INTO EDD.test1116 VALUES( ''' || Cur_Rec1.MOJI || ''' ) '; END IF; END LOOP; END LOOP; END; なにがなんだか、さっぱりわからないので、どうか、ご教授ください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
もしや Cur_Rec1.MOJIが NULLになることはありませんか? Cur_Rec1.MOJI が NULLですと、それを引数にする ほぼすべての関数が NULLを返しますから、現在のコードではおかしな動きになります。 各所に NVL関数を使ってみてください。
その他の回答 (4)
- 7colors
- ベストアンサー率25% (29/114)
EXCEPTION で VALUE_ERROR を拾ってDBMS_OUTPUTで 行を特定 そっから値の問題解決につなげては?
お礼
みなさま、お返事ありがとうございました。原因は、やはり、NULLの問題でした。例に書いたより、もっと複雑なSQLで、アドバイスどおりNVLにした項目が間違っていました。怪しい項目をNVLすると、うまくいきました。本当にありがとうございます。トレースして、よくわかりました。
- masusun
- ベストアンサー率15% (44/285)
ん? '('を含む場合のみ別処理ですよね。 だったらそれが何レコード目かは「あたり」じゃなくて「特定」することは簡単ですよね。 No.3の方もおっしゃってますがトレースしてみれば早いかと。 EDDに挿入しようとしている実際の値を見ないことには解決も難しいと思います。 ためしにEDD.test1116、A_TBL.MOJIがvarchar2だったらどうなりますか?
お礼
お返事ありがとうございました。レコード特定をヒントに原因がわかりました。上記に理由を書きます。
- Senna_FF
- ベストアンサー率45% (153/334)
>あたりをつけているレコードは ではなく、特定してください!! dbms_outputパッケージ等を使用して、A_TBL.MOJIの内容をトレースしてください。 その値をみればすぐわかると思いますが・・・
お礼
お返事ありがとうございました。原因がわかりました。上記に書きます。
- bin-chan
- ベストアンサー率33% (1403/4213)
ORA-06502: PL/SQL: 数値または値のエラー: 数値の精度が大きすぎます。が発生しました '<MOJIの内容>' をInsertしたいのですね。 なので SELECT MOJI FROM A_TBL のMOJIと INSERT INTO EDD.test1116 の精度は合っていますか? +2のサイズが必要ですよ。
補足
MOJI CHAR(9)で、test1116のMOJIは、CHAR(11)にしましたが、同じエラーがでます。 申し訳ありませんが、もう少しアドバイスをお願いします。
補足
NVLを使ってもだめでした。あたりをつけているレコードは、そのレコードだけをINSERTすると、うまくいんですよねえ。もう少し、アドバイスください。お手数をおかけしますが、どうかお願いします。