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についても意識したうえで、設計、実装を行うことによりエラーを減らすことが可能となります。