開発時に発生するエラー

ORA-06502: PL/SQL: 数値または値のエラーが発生しました (その1)

  • NULL データの取り扱いが不十分の可能性がある

ORA-06502 と数値の組み合わせの場合によくあるエラーが NULL のハンドリングが不足していることに起因するエラー。

例えば以下のソースコードでシンプルに再現できる。ただ実際の開発では難解な処理と NULL データの特殊性から テストをすり抜けて不正なデータが入力されるまで何事もなく眠っていることも少なくない。

  1. CREATE OR REPLACE PROCEDURE RIVUS.ORA_06502_NUM
  2. IS
  3. vStr VARCHAR2(10);
  4. BEGIN
  5. -- OK
  6. vStr := 'abc';
  7. FOR i in 1 .. LENGTH(vStr) LOOP
  8. DBMS_OUTPUT.PUT_LINE(SUBSTR(vStr,i,1));
  9. END LOOP;
  10.  
  11. -- NG
  12. vStr := NULL;
  13. FOR i in 1 .. LENGTH(vStr) LOOP   -- LENGTH(NULL) → NULL
  14. DBMS_OUTPUT.PUT_LINE(SUBSTR(vStr,i,1));
  15. END LOOP;
  16. END;
  17. /

実行結果

SQL> CALL ORA_06502_NUM();
a
b
c
CALL ORA_06502_NUM()
     *
行1でエラーが発生しました。:
ORA-06502: PL/SQL: 数値または値のエラーが発生しました
ORA-06512: "RIVUS.ORA_06502_NUM", 行14

ORA-06502: PL/SQL: 数値または値のエラー: 文字列バッファが小さすぎます (その2)

  • プロシージャの入力パラメータのスケールを超えた文字列長を代入している場合やプログラムが移植されたかキャラクタセットが想定しているものと違う場合に発生する。

新しい環境に移植した場合などにはキャラクタセットの違いにより文字列長のバイトサイズが異なることで発生する。
参考: 文字コード・キャラクタセットNLS_LENGTH_SEMANTICS

この例はデータベースキャラクタセットが Shift-JIS で作成されたデータベースでの実験

  1. CREATE OR REPLACE PROCEDURE RIVUS.ORA_06502_CHAR
  2. IS
  3. vCharStr  VARCHAR2(1 CHAR);
  4. vByteStr  VARCHAR2(2);
  5. -- vByteStr  VARCHAR2(3);
  6. BEGIN
  7. vCharStr := '戓'; -- EUC 3 Byte Code
  8. DBMS_OUTPUT.PUT_LINE(lengthb(vCharStr) || 'バイト');
  9. DBMS_OUTPUT.PUT_LINE(vCharStr);
  10.  
  11. -- SJIS では 2バイト であるが EUC では 3バイト必要になる
  12. vByteStr := convert(vCharStr,'ja16euc');
  13. DBMS_OUTPUT.PUT_LINE(lengthb(vByteStr) || 'バイト');
  14. END;
  15. /

実行結果

SQL> CALL ORA_06502_CHAR();
2バイト
戓
CALL ORA_06502_CHAR()
     *
行1でエラーが発生しました。:
ORA-06502: PL/SQL: 数値または値のエラー: 文字列バッファが小さすぎます。が発生しました
ORA-06512: "RIVUS.ORA_06502_CHAR", 行12


関連事項

一覧ページへ戻る

OTN (Oracle Technology Network)によるエラーメッセージによる情報だけでは、対処に困ったエラーについてのプラクティスです。
ベスト・プラクティスというわけではないので、書いてあることに固執しないで広い視野でエラー対応してください。

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ Oracle Web セミナー