Очень простой для кого-то. Следующая вставка дает мне
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');
CUSTOMER
? Вы предоставили только половину необходимой информации.Ответы:
Ошибка ORA-01722 возникает, когда делается попытка преобразовать строку символов в число, и строка не может быть преобразована в число.
Не видя определения вашей таблицы, похоже, что вы пытаетесь преобразовать числовую последовательность в конце списка значений в число, а пробелы, которые ее разделяют, вызывают эту ошибку. Но, судя по информации, которую вы нам предоставили, это может происходить в любом поле (кроме первого).
источник
Предположим, номер телефона определен, так как
NUMBER
тогда пробелы не могут быть преобразованы в число:Вышеупомянутое дает вам
источник
Вот один из способов решить эту проблему. Удалите нечисловые символы, а затем преобразуйте их в число.
источник
Поскольку эта ошибка возникает, когда вы пытаетесь вставить нечисловое значение в числовой столбец в базе данных, кажется, что ваше последнее поле может быть числовым, и вы пытаетесь отправить его как строку в базе данных. проверьте свое последнее значение.
источник
Ну это тоже может быть:
где для конкатенации в oracle используется оператор
||
not+
.В этом случае вы получите:
ORA-01722: invalid number ...
источник
Это потому что:
Как объяснено в:
Чтобы устранить эту ошибку:
источник
Oracle выполняет автоматическое преобразование String2number для значений столбца String ! Однако для текстовых сравнений в SQL входные данные должны быть явно разделены как String: обратное преобразование number2String не выполняется автоматически, ни на уровне SQL-запроса.
У меня был такой запрос:
Это представляло проблему:
Error: ORA-01722: invalid number
Я просто обвел "числовые" значения, чтобы сделать их "строками" , просто сделав их явно ограниченными :
... и вуаля: он возвращает ожидаемый результат.
edit: И действительно: столбец
acc_num
в моей таблице определяется какString
.invalid number
Сообщалось, хотя и не числовым . И явное разделение числовых строк решило проблему.С другой стороны, Oracle может рассматривать строки как числа. Таким образом, числовые операции / функции могут применяться к строкам, и эти запросы работают:
источник
В моем случае ошибка преобразования была в функциональном индексе , который я создал для таблицы.
Вставленные данные были в порядке. Мне потребовалось время, чтобы понять, что на самом деле ошибка связана с ошибочным индексом.
Было бы хорошо, если бы в этом случае Oracle мог выдать более точное сообщение об ошибке.
источник
Если вы сделаете
insert into...select * from...
заявление, также легко получить ошибку «Неверный номер».Допустим, у вас есть таблица
FUND_ACCOUNT
с двумя столбцами:Допустим, вы хотите изменить значение 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». Чтобы преобразовать '' (пустые) OFFICE_ID в 0, ваш оператор вставки должен выглядеть следующим образом:INSERT INTO FUND_ACCOUNT (AID_YEAR, OFFICE_ID) SELECT AID_YEAR, decode(OFFICE_ID,' ',0,OFFICE_ID) FROM FUND_ACCOUNT2;
источник
Это случилось и со мной, но проблема была в другом: в кодировке файлов .
Файл был правильным, но кодировка файла неправильная. Он был сгенерирован утилитой экспорта SQL Server, и я сохранил его как Unicode.
Сам файл выглядел хорошо в текстовом редакторе, но когда я открыл
*.bad
файл, созданный загрузчиком SQL * с отклоненными строками, я увидел, что между каждым исходным символом были плохие символы. Тогда я задумался о кодировке.Я открыл исходный файл с помощью Notepad ++ и преобразовал его в ANSI, и все загрузилось правильно.
источник
Ошибка ORA-01722 довольно проста. По словам Тома Кайта :
Однако, где проблема, часто сначала не очевидно. Эта страница помогла мне устранить, найти и исправить мою проблему. Подсказка: ищите места, где вы явно или неявно преобразуете строку в число. (У меня был
NVL(number_field, 'string')
в коде.)источник
попробуйте это также, если у вас есть ошибка неверного номера
В этом a.emplid - это число, а b.emplid - это varchar2, поэтому, если вам нужно преобразовать одну из сторон
где to_char (a.emplid) = b.emplid
источник
Вы всегда можете использовать функцию TO_NUMBER (), чтобы удалить эту ошибку. Ее можно включить как INSERT INTO значения phone_number сотрудников (TO_NUMBER ('0419 853 694');
источник