web-dev-qa-db-ja.com

SQLエラー "ORA-01722:無効な番号"

誰かにとって非常に簡単なもの、次の挿入は私に

ORA-01722:無効な番号

どうして?

INSERT INTO CUSTOMER VALUES (1,'MALADY','Claire','27 Smith St Caulfield','0419 853 694');
INSERT INTO CUSTOMER VALUES (2,'GIBSON','Jake','27 Smith St Caulfield','0415 713 598');
INSERT INTO CUSTOMER VALUES (3,'LUU','Barry','5  Jones St Malvern','0413 591 341');
INSERT INTO CUSTOMER VALUES (4,'JONES','Michael','7  Smith St Caulfield','0419 853 694');
INSERT INTO CUSTOMER VALUES (5,'MALADY','Betty','27 Smith St Knox','0418 418 347');
83
Phillip Gibson

文字列を数値に変換しようとしたときにORA-01722エラーが発生し、その文字列を数値に変換できません。

テーブルの定義を見なくても、値リストの末尾の数値シーケンスを数値に変換しようとしているように見え、それを区切るスペースによってこのエラーが発生します。しかし、あなたが私たちに与えた情報に基づいて、それはどんな分野でも起こるかもしれません(最初の分野以外)。

109
Aaron

電話番号がNUMBERと定義されていると、空白を数字に変換することはできません。

create table telephone_number (tel_number number);
insert into telephone_number values ('0419 853 694');

上記はあなたに与える

ORA-01722:無効な番号

21
hol

これを解決する1つの方法があります。数字以外の文字を削除してから、数値としてキャストします。

cast(regexp_replace('0419 853 694', '[^0-9]+', '') as number)
14
gmlacrosse

このエラーは、dbの数値列に数値以外の値を挿入しようとしたときに発生するので、最後のフィールドは数値の可能性があり、データベースに文字列として送信しようとしています。最後の値を確認してください。

10
Freelancer

まあそれもすることができます:

SELECT t.col1, t.col2, ('test' + t.col3) as test_col3 
FROM table t;

oracleでの連結には||ではなく演算子+を使用します。

この場合は、ORA-01722: invalid number ...となります。

8
Lazar Lazarov

それの訳は:

文字列を数値に変換しようとしたSQL文を実行しましたが、失敗しました。

で説明したように:

このエラーを解決するには

算術演算で使用できるのは、数値フィールドまたは数値を含む文字フィールドだけです。すべての式が数値に評価されることを確認してください。

7
Mahmoud Gamal

私の場合、変換エラーは関数ベースのインデックスにあり、それは私がテーブル用に作成したものです。

挿入されているデータは正常でした。実際のエラーがバグの多いインデックスから来ていることを理解するのに少し時間がかかりました。

この場合にOracleがより正確なエラーメッセージを出したとしたら、いいでしょう。

2
iTake

私はこの質問をしました:

select max(acc_num) from ACCOUNTS where acc_num between 1001000 and 1001999;

それは問題を提示しました:Error: ORA-01722: invalid number

ここでは、数値を'Strings'にし、を明示的に区切るにするために、 "数値"値を囲みました。

select max(acc_num) from ACCOUNTS where acc_num between '1001000' and '1001999';

... andvoilà:期待どおりの結果が返されます。

edit:そして私のテーブルのcol acc_numStringとして定義されています。数値ではありませんが、invalid numberが報告されました。文字列番号を明示的に区切ることで問題は解決しました。

一方、Oracleは文字列を数字として扱うことができます。そのため、数値操作/関数は文字列に適用でき、これらのクエリは機能します。

tABLEからmax(string_column)を選択します。

tABLEからstring_columnを選択します。ここで、string_columnは、 '2'と 'z'の間です。

tABLEからstring_columnを選択します。ここで、string_column> '1';

tABLEからstring_columnを選択します。ここで、string_column<= 'b';

2
Franta

insert into...select * from...ステートメントを実行すると、「無効な番号」エラーも簡単に発生します。

2列のFUND_ACCOUNTというテーブルがあるとしましょう。

AID_YEAR  char(4)
OFFICE_ID char(5)

また、OFFICE_IDを数値に変更したいが、テーブルには既存の行があり、さらに悪いことに、それらの行のいくつかはOFFICE_ID値が ''(空白)になっているとします。 Oracleでは、テーブルにデータがある場合、カラムのデータ型を変更することはできません。また、 ''を0に変換するには少し工夫が必要です。したがって、次のようにします。

  1. 重複するテーブルを作成します。CREATE TABLE FUND_ACCOUNT2 AS SELECT * FROM FUND_ACCOUNT;
  2. 元のテーブルからすべての行を削除します。DELETE FROM FUND_ACCOUNT;
  3. 元のテーブルにデータがなくなったら、そのOFFICE_ID列のデータ型を変更します。ALTER TABLE FUND_ACCOUNT MODIFY (OFFICE_ID number);

  4. しかし、これがトリッキーな部分です。空白のOFFICE_ID値が含まれている行があるため、単純なINSERT INTO FUND_ACCOUNT SELECT * FROM FUND_ACCOUNT2を実行すると、「ORA-01722無効な数値」エラーが発生します。 ''(空白)のOFFICE_IDを0に変換するには、insertステートメントは次のようになります。

INSERT INTO FUND_ACCOUNT (AID_YEAR, OFFICE_ID) SELECT AID_YEAR, decode(OFFICE_ID,' ',0,OFFICE_ID) FROM FUND_ACCOUNT2;

1
Frank Staheli