ORACLE エラーコード ORA-06502:式がありません。 が表示される原因と対応について記載しています。
ORA-06502エラーは、ORACLEのPL/SQLにおいて
変数にNULLがセットされているが、NULLが格納されていることを考慮できていない場合に発生します。
Javaで言うところのNullPointerExceptionのようなものです。
例えば、以下のようなコードを書くと発生します。
CREATE OR REPLACE PROCEDURE RIVUS.SAMPLE_ORA_06502_NG IS vStr VARCHAR2(10); BEGIN vStr := NULL; FOR i in 1 .. LENGTH(vStr) LOOP -- vStrはNULLであるため、LENGTH(NULL)もNULL -- ここでORA-06502エラー発生!! DBMS_OUTPUT.PUT_LINE(SUBSTR(vStr,i,1)); END LOOP; END; /
以下のように、NULL判定を行なうことと
値を設定してやることで、エラーを防ぐことができます。
CREATE OR REPLACE PROCEDURE RIVUS.SAMPLE_ORA_06502_OK IS vStr VARCHAR2(10); BEGIN vStr := 'abc'; -- vStrのNULLチェックを行なうことで万全に IF vStr IS NULL THEN DBMS_OUTPUT.PUT_LINE('NULLデータ'); ELSE FOR i in 1 .. LENGTH(vStr) LOOP -- abcと値がセットされているのでLENGTH(vStr)は3 -- 正常に数値、値がセットされているため、ORA-06502エラーは発生しない DBMS_OUTPUT.PUT_LINE(SUBSTR(vStr,i,1)); END LOOP; END IF; END; /
PL/SQLを書く方は、開発途中に発生させてしまうことの多いのが
このORA-06502エラーではないかと思います。
実際の開発でORA-06502エラーが発生するケースは、
上記のvStrの値として、データベース(DB)のデータを取得し用いる際に
システムとしては、DBのテーブルのそのカラムにデータが存在することを想定しているが
何らかのエラー(データ移行時やシステムのINSERT/UPDATE実装ミス)により
NULLが格納されていた(何も格納されていなかった)というケースに発生するのが
ORA-06502エラーだと思います。
適切なNULL判定(NULLチェック)を行なうことで回避できるものだと思います。
CREATE OR REPLACE PROCEDURE RIVUS.SAMPLE_ORA_06502_CHAR_NG IS vCharStr VARCHAR2(1 CHAR); vByteStr VARCHAR2(2); -- vByteStr VARCHAR2(3); BEGIN vCharStr := '・ス'; -- EUC 3 Byte Code DBMS_OUTPUT.PUT_LINE(lengthb(vCharStr) || 'バイト'); DBMS_OUTPUT.PUT_LINE(vCharStr); -- SJIS では 2バイト であるが EUC では 3バイト必要になる vByteStr := convert(vCharStr,'ja16euc'); DBMS_OUTPUT.PUT_LINE(lengthb(vByteStr) || 'バイト'); END; /
上記の
vByteStr := convert(vCharStr,'ja16euc');
で、ORA-06502エラーが発生してしまいます。
同じORA-06502エラーでも、こちらはデータ依存で発生してしまうことが多いです。
文字コードをconvertさせる際には注意が必要です。