【Oracle】「ORA-01722: 数値が無効です」が発生したときの確認方法

今回は、Oracle Databaseで「ORA-01722: 数値が無効です」が発生したときの原因と問題解決するための対象データを取得する方法を紹介していきます。

スポンサーリンク

検証環境

検証に使用した環境/ライブラリを次に記載します。

  • Oracle Database
    • バージョン:11g

発生原因

ORA-01722: 数値が無効です」が発生するのは、文字列型(VARCHARCHARなど)から値を数値型へ変換する処理(TO_NUMBERなど)を実施するとき、文字列型に数値以外の値が設定されているときに発生します。

【エラー発生例】

エラーが発生することを確認するためのSQLの例は、次のようになります。

create table example (id varchar(256));
insert into example values ('id');
select TO_NUMBER(id) from example;

作成したテーブルには、文字列型に数値以外の情報が登録されている状態になります。

最後のSELECT文では、文字列型を数値に変換する処理を実行しているためエラーが発生することを確認することができます。

解決方法

文字列型に数値以外の値を登録しないことでエラーは発生しなくなります。すでに値が登録されている場合は、対象の情報を削除することで問題解決することができます。

【対象データ確認方法】

数値以外の値が登録されていないことを確認する方法として、「REGEXP_LIKE」関数を利用することができます。確認するためのSQLの例は、次のようになります。

select example from REGEXP_LIKE(id, '[^0-9]');

REGEXP_LIKE」関数は、検索条件に正規表現を使用することができます。1番目の引数には、対象のカラム名を指定します。2番目の引数には、正規表現を指定します。

例では、正規表現に数値(0から9)以外の文字列が指定されているレコードを取得するための条件を指定しています。この正規表現を使用することで数値以外が登録されているデータを検索することができます。

使用できる条件などの詳細は、公式サイトのドキュメントの「REGEXP_LIKE条件」も参考にしてみてください。

パターン一致条件

まとめ

ORA-01722: 数値が無効です」が発生したときの原因と問題解決するための対象データを取得するための方法を紹介しました。