ora 01722 invalid number что за ошибка
Ошибка SQL «ORA-01722: недопустимый номер»
Очень простой для кого-то. Следующая вставка дает мне
Ошибка ORA-01722 возникает, когда делается попытка преобразовать строку символов в число, и строка не может быть преобразована в число.
Не видя определения вашей таблицы, похоже, что вы пытаетесь преобразовать числовую последовательность в конце списка значений в число, а пробелы, которые ее разделяют, вызывают эту ошибку. Но, судя по информации, которую вы нам предоставили, это может происходить в любом поле (кроме первого).
Предположим, номер телефона определен, так как NUMBER тогда пробелы не могут быть преобразованы в число:
Вышеупомянутое дает вам
Вот один из способов решить эту проблему. Удалите нечисловые символы, а затем преобразуйте их в число.
Поскольку эта ошибка возникает, когда вы пытаетесь вставить нечисловое значение в числовой столбец в базе данных, кажется, что ваше последнее поле может быть числовым, и вы пытаетесь отправить его как строку в базе данных. проверьте свое последнее значение.
Ну это тоже может быть:
Вы выполнили инструкцию 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’;
. и вуаля: он возвращает ожидаемый результат.
С другой стороны, Oracle может рассматривать строки как числа. Таким образом, числовые операции / функции могут применяться к строкам, и эти запросы работают:
выберите max (string_column) из ТАБЛИЦЫ;
выберите string_column из ТАБЛИЦЫ, где string_column между ‘2’ и ‘z’;
выберите string_column из ТАБЛИЦЫ, где string_column > ‘1’;
выберите string_column из ТАБЛИЦЫ, где string_column — Франта
источник
Вставленные данные были в порядке. Мне потребовалось время, чтобы понять, что на самом деле ошибка связана с ошибочным индексом.
Было бы хорошо, если бы в этом случае Oracle мог выдать более точное сообщение об ошибке.
Если вы сделаете insert into. select * from. заявление, также легко получить ошибку «Неверный номер».
Допустим, у вас есть таблица FUND_ACCOUNT с двумя столбцами:
Допустим, вы хотите изменить значение OFFICE_ID на числовое, но в таблице уже есть строки, и, что еще хуже, некоторые из этих строк имеют значение OFFICE_ID, равное » (пусто). В Oracle вы не можете изменить тип данных столбца, если в таблице есть данные, и требуется небольшая хитрость для преобразования » в 0. Итак, вот как это сделать:
Когда в исходной таблице нет данных, измените тип данных ее столбца OFFICE_ID: ALTER TABLE FUND_ACCOUNT MODIFY (OFFICE_ID number);
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, и все загрузилось правильно.
Oracle Data Integration, Cloud, Spatial and Analytics
Oracle Data Integration, Cloud, Spatial and Analytics (GoldenGate, ODI, Cloud, Spatial, Exadata)
Ошибка ORA-01722: неверное число или ORA-01722: invalid number
Обычно ошибка возникает при загрузки данных из текстового файла с помощью Oracle Sqlloader. Ошибка связана с тем, что в России разделитель целой и дробной часть запятая, а в США и Европе – точка.
Если попытаться загрузить в базу некорректно отформатированные данные, то Oracle их не поймет. Выйти из этого положения можно несколькими способами. Некоторые проще, некоторые сложне. Давайте рассмотрим их. Вначале простые, к концу более сложные и, возможно, чреватые проблемами.
1. Зайти в файл и заменить все точки на запятые. Например
1|New York|NY|7322564|1|2001|8307|-73.943849000|40.669800000|
заменяем на
Тут всеп просто. Никаких подводных камней, кроме того, что точки могут встречаться не только в числах и это надо отслеживать, иначе испортите данные.
Например в Linux это легко сделать с помощью sed (для Windows можно взять отсюда или использовать, скажем, perl). Команда не создает резервной копии.
2. В локальном файле при загрузке данных установить соответствующие параметры NLS.
Например, если загрузка осуществляется следующим скриптом батником:
sqlldr scott/[email protected] control=us_cities\us_cities.ctl data=us_cities\us_cities.dat
то ошибки можно избежать с помощью выполнения предварительно в bat-файле вот такой команды:
set nls_lang=american_america.CL8MSWIN1251
sqlldr scott/[email protected] control=us_cities\us_cities.ctl data=us_cities\us_cities.dat
Я считаю этот вариант наиболее предпочтительным.
3. Если это Windows, то можно изменить глобальные настройки NLS. Сделать это можно в реестре в веточке
Нужно будет вместо значения RUSSIAN_RUSSIA.CL8MSWIN1251 прописать AMERICAN_AMERICA.CL8MSWIN1251.
Это решение может очень сильно повлиять на систему в целом. Действие этого параметра может повлечь неработоспособность другого приложения.
4 комментария
очевидно, что sed это не только *nix, это просто «UNIX-way» — достаточно на google написать sed.exe
Ну и приведённая выше строчка не учитывает точки в тексте.
Я позволю себе небольшое добавление:
Каюсь 🙂 Поленился подольше погуглить насчет паттерна, который бы учитывал текст. А придумать самостоятельно навскидку — не такой я глубокий специалист в линуксе.
Очень полезная маска.
1|New York|NY|7322564|1|2001|8307|-73.943849000|40.669800000|
в каком файле это находится?
Ora 01722 invalid number что за ошибка
SELECT regip into rez
FROM regist
WHERE (date = var_date) AND
(time = var_time);
ora-01722 invalid number
����������, ���������� ��� ��� ��������.
| ||||||||||||||||||||||||||||||
Oerr Member ������: ������ |
|