プロが教える店舗&オフィスのセキュリティ対策術

以下の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;

なにがなんだか、さっぱりわからないので、どうか、ご教授ください。

A 回答 (5件)

もしや Cur_Rec1.MOJIが NULLになることはありませんか?



Cur_Rec1.MOJI が NULLですと、それを引数にする
ほぼすべての関数が NULLを返しますから、現在のコードではおかしな動きになります。

各所に NVL関数を使ってみてください。

この回答への補足

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

補足日時:2005/11/17 13:39
    • good
    • 0

EXCEPTION で VALUE_ERROR を拾ってDBMS_OUTPUTで


行を特定

そっから値の問題解決につなげては?
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/11/17 17:09

ん?



'('を含む場合のみ別処理ですよね。
だったらそれが何レコード目かは「あたり」じゃなくて「特定」することは簡単ですよね。
No.3の方もおっしゃってますがトレースしてみれば早いかと。

EDDに挿入しようとしている実際の値を見ないことには解決も難しいと思います。
ためしにEDD.test1116、A_TBL.MOJIがvarchar2だったらどうなりますか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/11/17 17:07

>あたりをつけているレコードは


ではなく、特定してください!!

dbms_outputパッケージ等を使用して、A_TBL.MOJIの内容をトレースしてください。
その値をみればすぐわかると思いますが・・・
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/11/17 17:06

ORA-06502: PL/SQL: 数値または値のエラー:


数値の精度が大きすぎます。が発生しました

'<MOJIの内容>' をInsertしたいのですね。

なので
SELECT MOJI FROM A_TBL のMOJIと
INSERT INTO EDD.test1116 の精度は合っていますか?
+2のサイズが必要ですよ。

この回答への補足

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

補足日時:2005/11/17 12:42
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す