• ベストアンサー

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; なにがなんだか、さっぱりわからないので、どうか、ご教授ください。

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

  • ベストアンサー
  • MZ-80B
  • ベストアンサー率56% (46/81)
回答No.2

もしや Cur_Rec1.MOJIが NULLになることはありませんか? Cur_Rec1.MOJI が NULLですと、それを引数にする ほぼすべての関数が NULLを返しますから、現在のコードではおかしな動きになります。 各所に NVL関数を使ってみてください。

pyontanrie
質問者

補足

NVLを使ってもだめでした。あたりをつけているレコードは、そのレコードだけをINSERTすると、うまくいんですよねえ。もう少し、アドバイスください。お手数をおかけしますが、どうかお願いします。

その他の回答 (4)

  • 7colors
  • ベストアンサー率25% (29/114)
回答No.5

EXCEPTION で VALUE_ERROR を拾ってDBMS_OUTPUTで 行を特定 そっから値の問題解決につなげては?

pyontanrie
質問者

お礼

みなさま、お返事ありがとうございました。原因は、やはり、NULLの問題でした。例に書いたより、もっと複雑なSQLで、アドバイスどおりNVLにした項目が間違っていました。怪しい項目をNVLすると、うまくいきました。本当にありがとうございます。トレースして、よくわかりました。

  • masusun
  • ベストアンサー率15% (44/285)
回答No.4

ん? '('を含む場合のみ別処理ですよね。 だったらそれが何レコード目かは「あたり」じゃなくて「特定」することは簡単ですよね。 No.3の方もおっしゃってますがトレースしてみれば早いかと。 EDDに挿入しようとしている実際の値を見ないことには解決も難しいと思います。 ためしにEDD.test1116、A_TBL.MOJIがvarchar2だったらどうなりますか?

pyontanrie
質問者

お礼

お返事ありがとうございました。レコード特定をヒントに原因がわかりました。上記に理由を書きます。

  • Senna_FF
  • ベストアンサー率45% (153/334)
回答No.3

>あたりをつけているレコードは ではなく、特定してください!! dbms_outputパッケージ等を使用して、A_TBL.MOJIの内容をトレースしてください。 その値をみればすぐわかると思いますが・・・

pyontanrie
質問者

お礼

お返事ありがとうございました。原因がわかりました。上記に書きます。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

ORA-06502: PL/SQL: 数値または値のエラー: 数値の精度が大きすぎます。が発生しました '<MOJIの内容>' をInsertしたいのですね。 なので SELECT MOJI FROM A_TBL のMOJIと INSERT INTO EDD.test1116 の精度は合っていますか? +2のサイズが必要ですよ。

pyontanrie
質問者

補足

MOJI CHAR(9)で、test1116のMOJIは、CHAR(11)にしましたが、同じエラーがでます。 申し訳ありませんが、もう少しアドバイスをお願いします。

関連するQ&A