Ошибка SQL «ORA-01722: неверный номер»

78

Очень простой для кого-то, следующая вставка дает мне

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');
  • 25
    Итак ... что такое определение таблицы для CUSTOMER ? Вы дали только половину необходимой информации.
  • 2
    Телефонные номера - единственное, что может быть разумно определено как число, которое ваши данные не представляют как число (пробелы не являются числами). Итак: проверьте определение вашей таблицы и сравните с вашими входными утверждениями.
Показать ещё 4 комментария
Теги:
plsql
type-conversion
casting

12 ответов

96

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

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

  • 1
    Также обратите внимание, что заполнение поля вручную с помощью «(null)» приведет к этой ошибке. Если значение по умолчанию равно нулю и вы не заполнили его, оно будет автоматически заполнено (пустым), но при вводе оно будет отличаться.
21

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

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

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

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

  • 0
    Это та же ошибка для формата даты?
  • 0
    Вы можете задать новый вопрос. Но нет, это другое сообщение об ошибке. Зависит от того, что ваше значение в инструкции вставки ist.
14

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

cast(regexp_replace('0419 853 694', '[^0-9]+', '') as number)
  • 5
    Выполнение этого удалит ведущий 0.
  • 2
    это относится к оригинальному OP - ваш столбец таблицы не может иметь тип «число», если вы хотите хранить значения типа «0419 853 694», потому что число не может иметь начальные нули. в моем случае, однако, это как раз то, что мне было нужно, Тай Гмлакросс!
10

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

7

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

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

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

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

  • 2
    Спасибо, помогло мне.
  • 0
    Этот подходит. Это может быть другая ядовитая судьба. Вы закомментировали поле в SELECT Fieldlist, например - t.fieldname. Позже вы намереваетесь удалить этот комментарий в начале строки, но один закомментированный символ останется случайно. Таким образом, есть: - т. Имя поля. Это случилось со мной, когда я работал над очень большим запросом, где мне приходилось комментировать / рационализировать сотни столбцов при реорганизации зверя.
6

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

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

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

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

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

2

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

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

  • 0
    Я столкнулся с похожей ситуацией. ora-01722 неверный номер был вызван в операторе выбора, а не в операторе вставки. Я проверил определение таблицы и обнаружил, что столбец был varchar вместо числа, поэтому я добавил одинарные кавычки вокруг числа
2

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

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

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

  • 1
    и триггер может вызвать эту ошибку, а также
1

Если вы выполняете инструкцию 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;

  • 0
    Это очень сложный пример случая, когда могла произойти ошибка + объяснение, как решить этот конкретный случай, который может вообще не применяться.
-1

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

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

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

-1

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

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

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

-4

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню