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

����������, ���������� ��� ��� ��������.2 ��� 04, 13:48����[780419] �������� | ���������� �������� ����������

ora 01722 invalid number что за ошибка. Смотреть фото ora 01722 invalid number что за ошибка. Смотреть картинку ora 01722 invalid number что за ошибка. Картинка про ora 01722 invalid number что за ошибка. Фото ora 01722 invalid number что за ошибкаRe: ora-01722 invalid number [new]
Oerr
Member

������: ������
���������: 774

Ash+

SELECT regip into rez
FROM regist
WHERE (date = var_date) AND
(time = var_time);

ora-01722 invalid number

������: ������
���������: 774

Ash+

SELECT regip into rez
FROM regist
WHERE (date = var_date) AND
(time = var_time);

ora-01722 invalid number

������: ����
���������: 33

� NLS_LANG �������.
������ ��� �� ���� ���������?
� ��� ������� ���� ��������� � �������������� �������������� �����. ������ ���� ���������.
2 ��� 04, 14:14����[780535] �������� | ���������� �������� ����������
ora 01722 invalid number что за ошибка. Смотреть фото ora 01722 invalid number что за ошибка. Смотреть картинку ora 01722 invalid number что за ошибка. Картинка про ora 01722 invalid number что за ошибка. Фото ora 01722 invalid number что за ошибкаRe: ora-01722 invalid number [new]
Oerr
Member

������:
���������: 473

� ����� ��������� ���� ���(���� �� ������� �� �������:)
2 ��� 04, 14:51����[780704] �������� | ���������� �������� ����������
ora 01722 invalid number что за ошибка. Смотреть фото ora 01722 invalid number что за ошибка. Смотреть картинку ora 01722 invalid number что за ошибка. Картинка про ora 01722 invalid number что за ошибка. Фото ora 01722 invalid number что за ошибкаRe: ora-01722 invalid number [new]
JcAlex
Member

������: Kiev
���������: 79

������� � ���� ��� ��� ����� ������ ����.
���������. ���� ���� ch varchar2(2) � ������� t.
�� �������� ������ �������� �� 2 ����. ������� ��� ���������� �������
������ ���� ��� ���� ������
select *
from t
where ch=01
�� ���� ������� ���� �� ����� ������ �� ��������� ‘�’ � ���� �h.
��� ����� � ��������� ��� ������. ����� ��� �������.
2 ��� 04, 15:07����[780778] �������� | ���������� �������� ����������
ora 01722 invalid number что за ошибка. Смотреть фото ora 01722 invalid number что за ошибка. Смотреть картинку ora 01722 invalid number что за ошибка. Картинка про ora 01722 invalid number что за ошибка. Фото ora 01722 invalid number что за ошибкаRe: ora-01722 invalid number [new]
Oerr
Member

������: ����
���������: 33

��� �� ���������.
������, �������� ��, ��� ���� ������������ � ����������.
���� ����������� ������������� ���.
������ �� �� ��������. )
���!
2 ��� 04, 15:47����[780960] �������� | ���������� �������� ����������
ora 01722 invalid number что за ошибка. Смотреть фото ora 01722 invalid number что за ошибка. Смотреть картинку ora 01722 invalid number что за ошибка. Картинка про ora 01722 invalid number что за ошибка. Фото ora 01722 invalid number что за ошибкаRe: ora-01722 invalid number [new]
Arthur Auhadeev
Member

CREATE TABLE TEST_NUMBER
( TEST_ID NUMBER(10))
/
INSERT INTO TEST_NUMBER VALUES(-707787162)
/
COMMIT
/
CREATE OR REPLACE
FUNCTION TEST_NUMB
RETURN number IS
rez NUMBER;
BEGIN
SELECT test_id INTO rez
FROM test_number;
RETURN rez ;
END;
/
SELECT Test_numb FROM dual
/

Источник

ORA-01722: ошибка неверного номера с динамическим кодом SQL PL / SQL

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

Чтобы помочь мне понять, что происходит, я установил по умолчанию все числовые значения на ноль, мои интуиция и ошибка, кажется, говорят мне, что здесь что-то не так:

Но я не думаю, что здесь следует полагаться на тип данных, если все значения правильно объявлены в разделе переменных в начале, и в них передаются одинаковые значения?

Помощь оценена. Спасибо, парни!

2 ответа

Сравните ваш запрос с оператором выборки. В вашем коде следующие переменные присваиваются этим переменным:

Вы правы, что ошибка указывает на строку

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

Поскольку у вас есть контроль над: C_TOTAL_ROW_COUNT, я думаю, это менее вероятно.

Первое, что я хотел бы проверить, это тип данных sum_bytes, если это не число (например, varchar2), то где-то в этом поле есть нечисловой символ, возможно, кто-то поставил 2000b, а не просто 2000).

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

Источник

I can’t understand the reason behind ORA-01722: invalid number

I have an issue that is generated randomly (one time between thousandth of calls). The error ORA-01722: invalid number is generated in a random way while executing sql update in a prepared statement Oracle database. The case details are as below:

and the value in log is like that :

4 Answers 4

We had a similar issue. Our hibernate based java code issued a prepared statement to fill in user info and a ‘reason for change’ for all save operations by using aspectJ.

In 3 separate database environments (Oracle 10G) this worked without any issues, but on the production database this sometimes failed with the ORA-01722 error. This only happens when the cpu load on the database server is close to 100%.

On another forum I found a suggestion about not passing along Long objects but doing the unboxing explicitly to a long primitive. It seems the jdbc driver or the database itself has issues when doing this unboxing on high load (even if that sounds pretty crazy). Various jdbc drivers were tested, such as the 1.4 and 1.6 versions.

The code that sometimes failed was:

Now we changed the code to make an explicit preparedStatement like this:

This issue has not happened since, even while the environment stayed the same with the same software and high load on the database.

I’ve heard from a colleague that one of the DBA’s could see in the logging that the prepared statement was accepted by the database, but no cpu was assigned to it. (Makes sense since all cpu’s would be busy on such a high load.) It might be that simply the wrong error is thrown, a ‘database overload’ error of some sorts should be thrown or something. Even better would be to never create such an error anyway.

I guess it’s primarily the database load though, it’s not smart at all to let the cpu load reach 100% all the time.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *