Ошибка 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');

Ответ 1

Ошибка ORA-01722 возникает, когда делается попытка преобразовать символьную строку в число, а строка не может быть преобразована в число.

Не видя определения таблицы, похоже, вы пытаетесь преобразовать числовую последовательность в конце списка значений в число, а пробелы, которые ее ограничивают, выбрасывают эту ошибку. Но на основании информации, которую вы нам дали, это может происходить в любом поле (кроме первого).

Ответ 2

Предположим, что номер телефона определен как NUMBER, тогда пробелы не могут быть преобразованы в число:

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

Вышеупомянутое дает вам

ORA-01722: недопустимый номер

Ответ 3

Вот один из способов его решения. Удалите нечисловые символы, а затем произведите их как число.

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

Ответ 4

Поскольку эта ошибка возникает, когда вы пытаетесь вставить нечисловое значение в числовой столбец в db, кажется, что ваше последнее поле может быть числовым, и вы пытаетесь отправить его в виде строки в базе данных. проверьте свое последнее значение.

Ответ 5

Ну, это также может быть:

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

где для конкатенации в оракуле используется оператор || not +.

В этом случае вы получаете: ORA-01722: invalid number ...

Ответ 6

Это происходит потому, что:

Вы выполнили инструкцию SQL, которая пыталась преобразовать строку в номер, но он не увенчался успехом.

Как объясняется в:

Чтобы устранить эту ошибку:

Только числовые поля или символьные поля, которые содержат числовые значения может использоваться в арифметических операциях. Убедитесь, что все выражения оценивать число.

Ответ 7

В моем случае ошибка конверсии находилась в индексе функциональных оснований, который я создал для таблицы.

Вводимые данные были в порядке. Мне потребовалось некоторое время, чтобы понять, что фактическая ошибка исходит от багги-индекса.

Было бы неплохо, если бы Oracle мог дать более точное сообщение об ошибке в этом случае.

Ответ 8

У меня был этот запрос:

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

... и вуаля: возвращает ожидаемый результат.

edit: И действительно: col acc_num в моей таблице определяется как String. Хотя это и не числовое значение, сообщалось invalid number. И явное разграничение строковых чисел решило проблему.

С другой стороны, Oracle может рассматривать строки как числа. Таким образом, числовые операции/функции могут применяться к строкам, и эти запросы работают:

выберите max (string_column) из TABLE;

выберите string_column из TABLE, где string_column между '2' и 'z';

выберите string_column из таблицы, где string_column > '1';

выберите string_column из таблицы, где string_column <= 'b';

Ответ 9

Если вы выполняете инструкцию insert into...select * from..., легко получить ошибку "Недопустимый номер".

Скажем, у вас есть таблица с именем FUND_ACCOUNT, которая имеет два столбца:

AID_YEAR  char(4)
OFFICE_ID char(5)

И скажем, что вы хотите изменить значение OFFICE_ID как числовое, но что в таблице есть существующие строки, а еще хуже, некоторые из этих строк имеют значение OFFICE_ID '' (пустое). В Oracle вы не можете изменить тип данных столбца, если в таблице есть данные, и для этого нужно немного обмануть преобразование '' в 0. Итак, вот как это сделать:

  • Создайте дублируемую таблицу: CREATE TABLE FUND_ACCOUNT2 AS SELECT * FROM FUND_ACCOUNT;
  • Удалите все строки из исходной таблицы: DELETE FROM FUND_ACCOUNT;
  • Как только нет данных в исходной таблице, измените тип данных своего столбца OFFICE_ID: ALTER TABLE FUND_ACCOUNT MODIFY (OFFICE_ID number);

  • Но вот тут сложная часть. Поскольку некоторые строки содержат пустые значения OFFICE_ID, если вы делаете простой INSERT INTO FUND_ACCOUNT SELECT * FROM FUND_ACCOUNT2, вы получите ошибку "ORA-01722 Invalid Number". Чтобы преобразовать '' (blank) OFFICE_IDs в 0, ваш оператор insert должен выглядеть следующим образом:

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

Ответ 10

попробуйте это также, когда у вас неверная ошибка номера

В этом a.emplid - число, а b.emplid - varchar2, поэтому, если вам нужно преобразовать одну из сторон

где to_char (a.emplid) = b.emplid

Ответ 11

Ошибка ORA-01722 довольно проста. Согласно Tom Kyte:

Мы попытались либо экспликацию, либо импликацию преобразовать символьную строку в число, и она не работает.

Однако, когда проблема часто не очевидна вначале. Эта страница помогла мне устранить, найти и исправить мою проблему. Подсказка: найдите места, где вы явно или неявно преобразуете строку в число. (У меня был NVL(number_field, 'string') в моем коде.)

Ответ 12

Вы всегда можете использовать функцию TO_NUMBER(), чтобы удалить эту ошибку. Это может быть включено как INSERT INTO employee phone_number (TO_NUMBER ('0419 853 694');