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


101

誰かのための非常に簡単なもの、次の挿入は私に与えています

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');

28
それで...テーブル定義はCUSTOMER何ですか?必要な情報の半分しか提供していません。
グレッグヒューギル2012

3
電話番号は、合理的に数値として定義される可能性がある唯一のものであり、データは数値として表しません(スペースは数値ではありません)。だから:あなたのテーブル定義をチェックして、あなたの入力ステートメントと比較してください。
APC

10
なぜ人々はこの質問に反対票を投じるでしょう。データベースに不慣れな人にとって、これは奇妙なエラーです。値を引用符で囲むと、文字列のように見えることがわかります。それは、データベースの設定に依存します。それはすべて文字列または数値である可能性があり、フィールドに依存します。データベース作成時のエラーかもしれません。
sisharp 2013年

上記の状況の例:table_1(rollNumber)の値( '123')に挿入します。ここで、rollNumberはタイプ「number」の列です。
イシャニグプタ2017

3
「12時に戻って、私は本を棚から取り出し、オラクルの質問に答えました。「スタックでは、私はまだ十分な知識を持っていますが、私は自分の知識に精通していますが、まだ受け入れられません
アーロン

回答:


121

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

テーブルの定義を表示しないと、値リストの最後の数値シーケンスを数値に変換しようとしているように見え、それを区切るスペースがこのエラーをスローしています。しかし、あなたが私たちに与えた情報に基づいて、それは(最初のもの以外の)あらゆる分野で起こっている可能性があります。


2
また、フィールドに「(null)」を手動で入力すると、そのエラーが発生することにも注意してください。デフォルトがnullで完了していない場合は、(null)でオートコンプリートされますが、入力しても同じではありません。
bogdan.rusu

ええ、「文字列は数値に変換できません」-それはポイントではありません。文字列は数値に変換できます。ここでのポイントは、数値から文字列列への逆の変換ですが、Oracleはそれを自動的に行いません。SQL式で値を明示的にマークし、それを文字列にして、 '' OR ""で囲む必要があります。 。
フランタ

25

電話番号が次のように定義されてNUMBERいるとします。空白は数値に変換できません。

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

上記はあなたに与えます

ORA-01722:番号が無効です


16

これを解決する1つの方法を次に示します。数値以外の文字を削除してから、数値としてキャストしてください。

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

6
これを行うと、大手0削除します
ジョー・C

2
これは元のOPに適用されます-'0419 853 694'のような値を格納する場合は、数値に先行ゼロを付けることができないため、テーブルの列のタイプを「数値」にすることはできません。私の場合、これは私が必要とするものです、ty gmlacrosse!
Hipokito 2014

10

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


8

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

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

Oracleでの連結に演算子||not が使用されている場合+

この場合、次のようになります。 ORA-01722: invalid number ...


1
それは良いものです。別の有毒な運命はこれかもしれません。SELECTフィールドリストのフィールドを--t.fieldnameのようにコメントアウトしました。後でその行開始コメントを削除する予定ですが、コメントされた1文字が誤って残されています。したがって、次のようになります。-t.fieldname。これは、非常に大きなクエリで作業していたときに発生しました。獣を再編成するときに、何百もの列をコメント/コメント解除する必要があります。
olippuner

8

それの訳は:

文字列を数値に変換しようとするSQLステートメントを実行しましたが、失敗しました。

で説明されているように:

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

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


4

Oracleは、文字列列の値に対して、自動String2number変換を実行します!ただし、SQLでのテキスト比較の場合、入力は明示的に文字列として区切る必要があります。逆の変換number2Stringは、SQLクエリレベルではなく、自動的には実行されません。

私はこのクエリを持っていました:

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';

...そしてほら:期待される結果を返します。

編集: 実際acc_num、私のテーブルのcol はとして定義されていStringます。数値ではありません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';


私は同様の状況に遭遇しました。ora-01722 invalid-numberは、insertステートメントではなく、selectステートメントでトリガーされました。テーブルの定義を確認したところ、列が数値ではなくvarcharであることがわかりました。そのため、数値を一重引用符
Newton fan 01

2

私の場合、変換エラーは、テーブル用に作成した機能ベースのインデックスにありました。

挿入されているデータは問題ありませんでした。実際のエラーがバグのあるインデックスに起因することを理解するのにしばらく時間がかかりました。

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


1

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

次のFUND_ACCOUNT2つの列を持つというテーブルがあるとします。

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 Invalid Number」エラーが発生します。''(空白)OFFICE_IDを0に変換するには、挿入ステートメントは次のようにする必要があります。

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


これは、エラー発生する可能性のあるケースの非常に複雑な例+その特定のケースを解決する方法の説明であり、まったく当てはまらない場合があります。
Jan Doggen、2015

0

これは私にも起こりましたが、問題は実際には異なりました:ファイルエンコーディング

ファイルは正しいですが、ファイルのエンコードが間違っていました。SQL Serverのエクスポートユーティリティによって生成され、Unicodeとして保存しました。

ファイル自体はテキストエディターでは問題なく見えました*.badが、SQL * loaderが拒否した行で生成したファイルを開くと、元のすべての文字の間に不正な文字があることがわかりました。次に、エンコーディングについて考えます。

元のファイルをNotepad ++で開いてANSIに変換し、すべてが正しく読み込まれました。


-1

ORA-01722エラーは非常に簡単です。トム・カイトによると:

文字列を明示的または暗黙的に数値に変換しようとしましたが、失敗しました。

ただし、問題がどこにあるかは、多くの場合、最初は明らかではありません。 このページは、問題のトラブルシューティング、発見、修正に役立ちました。ヒント:文字列を明示的または暗黙的に数値に変換している場所を探します。(NVL(number_field, 'string')自分のコードにありました。)


-1

無効な数値エラーが発生した場合も、これを試してください

この場合、a.emplidは数値で、b.emplidはvarchar2です。したがって、側面の1つを変換する必要がある場合

ここで、to_char(a.emplid)= b.emplid


-4

このエラーを削除するには、いつでもTO_NUMBER()関数を使用できます。これは、INSERT INTO従業員の電話番号の値(TO_NUMBER( '0419 853 694');として含めることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.