Oracleエラー対応(ORA-06502):PL/SQL: 数値または値のエラーが発生した場合の対処方法について

Oracleエラー対応(ORA-06502):PL/SQL: 数値または値のエラーが発生した場合の対処方法について

現役DBAが解説 ~Oracleエラー対応~

PL/SQL内で、データ型や制約に違反する値が代入された場合、ORA-06502、ORA-06512 が発生します。
いくつかのケースについて、原因および解決策をご説明します。

1. エラーメッセージ

ORA-06502: PL/SQL: 数値または値のエラー: 文字列バッファが小さすぎます。が発生しました		
ORA-06512: "<PL/SQL名>", <行番号>		
ORA-06512: <行番号>		

2. 事象・原因・対策

本記事では、ORA-06502、ORA-06512が発生するケースの中で代表的なものを2つご紹介します。

①文字コード変更による変数サイズに起因する問題

データベース移行時の文字コード変換に伴い、全角文字のバイト数が変更された場合、変数に設定されているバイト数を超えてしまい、ORA-06502、ORA-06512エラーが発生するケースがあります。

PL/SQL例

CREATE OR REPLACE PROCEDURE PROCTAB1
IS
  COL VARCHAR2(30);
BEGIN
  SELECT COL1 INTO COL FROM TAB1;
  DBMS_OUTPUT.PUT_LINE(COL);
END;

COL1の値を「株式会社システムエグゼ」とします。(11文字)

移行前データベース : JA16SJIS (全角文字 : 2バイト)
移行先データベース : AL16UTF16 (全角文字 : 3バイト)

である場合、移行前は22バイトだったものが33バイトとなるため、PL/SQL実行時に以下のようにエラーとなります。

EXECUTE PROCTAB1
Error
[row:1,col:1] ORA-06502: PL/SQL: 数値または値のエラー: 文字列バッファが小さすぎます。が発生しました
ORA-06512: "STATTEST.PROCTAB1", 行5
ORA-06512: 行1

ORA-06512の内容は以下の通りとなります。

  • 1つ目のORA-06512 : エラーとなったPL/SQL名と、何行目でエラーが発生したか
  • 2つ目のORA-06512 : エラーとなったPL/SQLを実行した処理の何行目でエラーが発生したか(今回はEXECUTE文1行なので行1となります)

対策としては PL/SQL 内の変数定義を変更する必要があります。
文字コード変更を伴う移行時には、テーブルのカラム長だけではなく、PL/SQL内の精査も必要となります。

本ケースと同等の例として、NUMBER型の桁あふれや文字と数値の変換エラーの場合も本エラーとなります。

②NOT NULL等の制約考慮漏れ

①のケースと少し似ていますが、NULLに対するハンドリングも考慮する必要があります。
以下のようなテーブル・レコード・PL/SQLを想定します。

<テーブル>
 CREATE TABLE TABNULLOK (COL1 NUMBER(5),COL2 VARCHAR2(10)) ;

<レコード>
  SQL> SELECT COL1, COL2 FROM TABNULLOK;
       COL1   COL2
  ----------    ----------
           1      ONE
           2

<PL/SQL>
  CREATE OR REPLACE PROCEDURE PROCNULL(VARIABLE_NUM IN NUMBER)
  AS   
    VARIABLE_COL1 NUMBER(5)    NOT NULL := 1   ;
    VARIABLE_COL2 VARCHAR2(10) NOT NULL := 'A' ;
  BEGIN
    SELECT COL1,COL2 INTO VARIABLE_COL1,VARIABLE_COL2 FROM TABNULLOK WHERE COL1 =   VARIABLE_NUM;
  END;

この状況でCOL2がNULLであるレコードを指定した場合、以下のようにPL/SQLがエラーとなります。

EXECUTE PROCNULL(2)
Error
[row:1,col:1] ORA-06502: PL/SQL: 数値または値のエラーが発生しました
ORA-06512: "STATTEST.PROCNULL", 行6
ORA-06512: 行1

対策としては、NOT NULLが指定されている変数やカラムへの代入時にNVL関数等を使ったハンドリングを行うことが考えられます。

5. 最後に

ORA-06502およびそれに付随するORA-06512に関する説明は以上となります。

テーブルのカラム長だけでなく、PL/SQL内の変数のカラム長・データ型・NOT NULLについても意識したうえで、設計、実装を行うことによりエラーを減らすことが可能となります。