今回は、Oracle Database
で「ORA-01722: 数値が無効です
」が発生したときの原因と問題解決するための対象データを取得する方法を紹介していきます。
検証環境
検証に使用した環境/ライブラリを次に記載します。
- Oracle Database
- バージョン:11g
発生原因
「ORA-01722: 数値が無効です
」が発生するのは、文字列型(VARCHAR
、CHAR
など)から値を数値型へ変換する処理(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: 数値が無効です
」が発生したときの原因と問題解決するための対象データを取得するための方法を紹介しました。