Ошибка 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? Вы предоставили только половину необходимой информации.
Грег Хьюгилл,
3
Телефонные номера - единственное, что может быть определено как число, которое ваши данные не представляют как число (пробелы не являются числами). Итак: проверьте определение вашей таблицы и сравните с вашими операторами ввода.
APC,
11
Почему люди проголосовали против этого вопроса. Для людей, которые плохо знакомы с базами данных, это странная ошибка. Я вижу, как заключение значений в кавычки может сделать его похожим на строку. Это просто зависит от того, как настроена база данных. Это могут быть все строки или числа, в зависимости от полей. Возможно, это была ошибка при создании базы данных.
sisharp
Пример вышеописанной ситуации: вставить в table_1 (rollNumber) значения ('123'); где rollNumber - столбец типа «число».
Ishani Gupta
3
«Назад в o`twelve, я вытащил книгу с полки, и ответил на вопрос Oracle В«Stack я все еще адептом, с знанием я сохранил, но я до сих пор не имеют. Принять. »
Aaron

Ответы:

121

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

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

Аарон
источник
2
Также обратите внимание, что заполнение поля вручную с помощью «(null)» даст вам эту ошибку. Если значение по умолчанию равно нулю, и вы не завершите его, оно будет автоматически заполнено (null), но когда вы его вводите, это не то же самое.
bogdan.rusu 05
Эх, «строку нельзя преобразовать в число» - не в этом дело. Строку МОЖНО преобразовать в число. Дело здесь в обратном преобразовании числа в столбец String, но Oracle не делает этого автоматически: вы должны сами сделать его String, явно пометив значение в своем выражении SQL, чтобы окружить его "OR" " .
Франта,
26

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

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

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

ORA-01722: неверный номер

Хол
источник
16

Вот один из способов решить эту проблему. Удалите нечисловые символы, а затем преобразуйте их в число.

cast(regexp_replace('0419 853 694', '[^0-9]+', '') as number)
gmlacrosse
источник
6
Это приведет к удалению ведущего 0.
Joe C
2
это относится к исходному OP - ваш столбец таблицы не может иметь тип "number", если вы хотите хранить значения, такие как '0419 853 694', потому что число не может иметь начальных нулей. Однако в моем случае это именно то, что мне нужно, ty gmlacrosse!
hipokito
10

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

Фрилансер
источник
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. Позже вы собираетесь удалить этот комментарий начала строки, но случайно остался один закомментированный символ. Таким образом, существует: - t.fieldname. Это случилось со мной, когда я работал над очень большим запросом, где мне приходилось комментировать / раскомментировать сотни столбцов, реорганизуя зверя.
olippuner
8

Это потому что:

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

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

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

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

Махмуд Гамаль
источник
4

Oracle выполняет автоматическое преобразование String2number для значений столбца String ! Однако для текстовых сравнений в SQL входные данные должны быть явно разделены как String: обратное преобразование number2String не выполняется автоматически, ни на уровне SQL-запроса.

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

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

Это представляло проблему: Error: ORA-01722: invalid number

Я просто обвел "числовые" значения, чтобы сделать их "строками" , просто сделав их явно ограниченными :

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

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

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

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

выберите max (string_column) из ТАБЛИЦЫ;

выберите string_column из ТАБЛИЦЫ, где string_column между '2' и 'z';

выберите string_column из ТАБЛИЦЫ, где string_column > '1';

выберите string_column из ТАБЛИЦЫ, где string_column <= 'b';

Франта
источник
я столкнулся с подобной ситуацией. ora-01722 неверный номер был инициирован оператором выбора, а не оператором вставки. Я проверил определение таблицы и обнаружил, что столбец представляет собой varchar вместо числа, поэтому я добавил одинарные кавычки вокруг числа
фанат Ньютона 01
2

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

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

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

я беру
источник
1

Если вы сделаете insert into...select * from...заявление, также легко получить ошибку «Неверный номер».

Допустим, у вас есть таблица 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 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;

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

Это случилось и со мной, но проблема была в другом: в кодировке файлов .

Файл был правильным, но кодировка файла неправильная. Он был сгенерирован утилитой экспорта SQL Server, и я сохранил его как Unicode.

Сам файл выглядел хорошо в текстовом редакторе, но когда я открыл *.badфайл, созданный загрузчиком SQL * с отклоненными строками, я увидел, что между каждым исходным символом были плохие символы. Тогда я задумался о кодировке.

Я открыл исходный файл с помощью Notepad ++ и преобразовал его в ANSI, и все загрузилось правильно.

ciencia
источник
-1

Ошибка ORA-01722 довольно проста. По словам Тома Кайта :

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

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

Баодад
источник
-1

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

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

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

Джей
источник
-4

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

Харшит Гупта
источник