Sql error 1722 42000 ora 01722 неверное число

Oracle SQL Error [1722] [42000]: ORA-01722: invalid number (runs well on SQL Developer) #6513

Comments

System information:

  • Windows 10 pro (EN)
  • DBeaver 6.1.4
  • Without additional extensions

Connection specification:

Describe the problem you’re observing:
Running a query were I’m multiplying 2 varchar (one of them converted to_numeric) returns me the error «SQL Error [1722] [42000]: ORA-01722: invalid number». The same query runs well on SQL Developer.

Columns configuration:

Columns on query:

Execution of the same query in SQL Developer:

org.jkiss.dbeaver.model.sql.DBSQLException: SQL Error [1722] [42000]: ORA-01722: invalid number

Caused by: java.sql.SQLSyntaxErrorException: ORA-01722: invalid number

The text was updated successfully, but these errors were encountered:

Generally it works fine in DBeaver
SELECT to_number(‘123’) * ‘3’ FROM dual
shows 369 in results. So problem is definitely not in multiplying numbers. Perhaps some of varchars is not actually a number.

try to find
select option_3 from _table_ where not REGEXP_LIKE(option_3, ‘^[ ]*[+,-]*[0-9]*[.]?[0-9]*$’)

Thanks for your reply @cerebel and @serge-rider


I taked the suggestion from @cerebel but for field option_4. And I got all the table rows returning on query result. This happened because the numbers were saved with comma instead of dot for decimal separator.

I know that this is not a normal and «valid» operation (multiplying numerics with varchars), but why it works on Oracle SQL Developer and in DBeaver returns error? The Oracle Connection Driver is the same.

the difference might be in language settings. sqldeveloper changes many oracle session options that affect how numbers/dates are interpreted.

@jpfmeneses about dot/comma of decimal separator — checks
select * from v$nls_parameters where parameter =’NLS_NUMERIC_CHARACTERS’
oracle say v10 by example
NLS_NUMERIC_CHARACTERS =»decimal_character group_separator»
so, find which application changes nls_param.. ( try sqplus, sqlDevelopper, dbeaver)
In dbeaver:queryManger (enable all options in preferences/general/queryMangery:queryTypes, and open view of queryManger)- this param is not changed.

@cerebel thanks for your feedback.

SQL Developer:

I went into Dbeaver to run that query first, after that opened the SQL Developer and go back to Dbeaver and verified that the parameter stayed with the same values, but different from SQL Developer. There is any DBeaver option that I can consider to change this parameter?

@jpfmeneses will set [,] as decimal separator (at session level)
databaseNavigator->editConnection ->connectionSettings-> initialization->bootstrapQueries
ALTER SESSION SET NLS_NUMERIC_CHARACTERS=’,.’
or execute upper sql, in editor ..

src
In SQL Developer, Preferences->Database-> NLS, if you change the Decimal Separator setting, you also need to make sure that your new setting doesn’t conflict with the existing Group Separator setting.
In this case, you needed to change Decimal Separator to a period ., but also change the Group Separator setting from a period to a comma , to avoid a setting conflict.
or, in editor, run upper sql ..

Better to redefine which decimal separator will be used in yours option_X columns, because at database level — it is [.], not [,] .

READ  Vivopay kiosk 3 прошивка

© 2023 GitHub, Inc.

You can’t perform that action at this time.

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.

Источник

ORA-01722: invalid number | How to resolve ORA-01722 error?

ORA-01722: invalid number :

In my previous article i have given the brief introduction about different errors like ORA-12154: TNS listener error and ORA-00600 which is related to internal error codes.The third most searched Error for oracle is ORA-01722 Error which is Invalid Number error. This error is searched approximately 25 k times per month in google search engine.In this article i will try to explain you why this error will come and how this error will solve.You will get this error while converting non numeric string to number or while inserting string value or character value in to number column.

“ORA-01722 error will be searched approximately 25 k times per month on google.”

Why ORA-01722 error will come?

This is another common error the SQL and PL SQL developers and DBAs will face.This error will come in oracle for mismatching the datatype as number to string or trying to insert the string value in to number values.There should be different reasons for this error.I will mention some scenarios in which this error will come.

Situation 1 :

When user tries to convert string value to number value.

To explain this scenario i will take a simple example. I will try to convert the string in to number using TO_NUMBER function.

Query :

Output :

ORA-01722: invalid number

Situation 2:

When user tries to insert the string value in to number column.

Query:

insert into Employee
values(1);
commit;

select * from Employee;

insert into Employee
values(‘amit’);
commit;

Output :

ORA-01722: invalid number

The ORA-01722 error will come when you try to convert the string value in to number.

Situation 3 :

Query :

insert into Test111
values(‘1′);
commit;

insert into Test111

insert into Test111
values(‘a’);
commit;

select * from Test111 where no1 between 0 and 10;

Output :

ORA-01722: invalid number

NO TIME TO READ CLICK HERE TO GET THIS ARTICLE

Resolution of the Error :

I have given the basic scenarios of producing the ORA-1722 error.This error will come when we tries to convert the string value in to number using to_number function. The string can not be converted to number.So to resolve the error we need to use number value in to_number function.

Resolution 1 :

Use number value in to_number function.

Query :

Output :

Always use number value (for varchar2 column) in to_number function to convert that value to number.

Resolution 2 :

Check description of table and change the column to varchar2 column if you want to insert the varchar2 value in the column.

Query :

modify rollno varchar2(10);

insert into Employee
values(‘amit’);
commit;

Источник

How to Resolve ORA-01722: invalid number

ORA-01722

ORA-01722 means that the arithmetic operation in the statement failed to calculate because one of operands cannot be converted to a valid number implicitly.

Let’s see some error patterns.

A. Type Conversion

We created a simple table containing only one column with NUMBER type.

SQL> create table salaries (salary number);

READ  Panasonic tx lr32xm5a прошивка

When we tried to insert a row into the table containing NUMBER column, we got ORA-01722.

SQL> insert into salaries (salary) values ( ‘200,000’ );
insert into salaries (salary) values (‘200,000’)
*
ERROR at line 1:
ORA-01722: invalid number

1. Make it Easier to Convert

This is because the value ‘200,000’ of column SALARY cannot be converted into a valid number. We should make it easier to be converted, so we remove the comma separator.

SQL> insert into salaries (salary) values ( ‘200000’ );

Unsurprisingly, string ‘200000’ can be converted to a number and inserted into the table.

2. Use VARCHAR2

You cannot always depend on unpredictable implicit conversion, sometimes, you should change the column from NUMBER into VARCHAR2 . For example, phone numbers of customers may not be perfectly formatted as NUMBER .

SQL> insert into customers (cust_id, phone_number) values (100, ‘0254 539 2413’);
insert into customers (cust_id, phone_number) values (100, ‘0254 539 2413’)
*
ERROR at line 1:
ORA-01722: invalid number

As we can see, the value of phone number cannot be converted into a NUMBER , so we should use VARCHAR2 instead.

SQL> alter table customers modify phone_number varchar2 (13);

SQL> insert into customers (cust_id, phone_number) values (100, ‘0254 539 2413’);

B. String Concatenation

Using a plus (add) sign can not concatenate strings.

SQL> set heading off;
SQL> select ‘Today is ‘ + sysdate from dual;
select ‘Today is ‘ + sysdate from dual
*
ERROR at line 1:
ORA-01722: invalid number

SQL parser thought your statement was trying to do an arithmetic operation, but the string ‘Today is ‘ failed to be converted into number. The correct way to concatenate strings is to use || , not a plus sign + .

SQL> select ‘Today is ‘ || sysdate from dual;

Today is 26-DEC-19

As a result, the output is perfect in concatenating a string and a date without ORA-01722.

A very similar error that you might see in your PL/SQL codes is ORA-06502: PL/SQL: numeric or value error, which is also related to conversion issues of numeric values.

Источник

Ora 01722 неверное число

Сервер переехал на новый сайт http://www.oraclegis.com/blog. Здесь идет ретрансляция

пятница, 21 ноября 2008 г.

Ошибка ORA-01722: неверное число или ORA-01722: inval >

Обычно ошибка возникает при загрузки данных из текстового файла с помощью Oracle Sqlloader. Ошибка связана с тем, что в России разделитель целой и дробной часть запятая, а в США и Европе – точка.

Если попытаться загрузить в базу некорректно отформатированные данные, то Oracle их не поймет. Выйти из этого положения можно несколькими способами. Некоторые проще, некоторые сложне. Давайте рассмотрим их. Вначале простые, к концу более сложные и, возможно, чреватые проблемами.

1. Зайти в файл и заменить все точки на запятые. Например

1|New York|NY|7322564|1|2001|8307|-73.943849000|40.669800000|
заменяем на

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

Например в Linux это легко сделать с помощью sed (для Windows можно взять отсюда или использовать, скажем, perl). Команда не создает резервной копии.

sed -i ‘s/./,/g’ filename.txt

2. В локальном файле при загрузке данных установить соответствующие параметры NLS.

Например, если загрузка осуществляется следующим скриптом батником:

sqlldr scott/[email protected] control=us_citiesus_cities.ctl data=us_citiesus_cities.dat

то ошибки можно избежать с помощью выполнения предварительно в bat-файле вот такой команды:

set nls_lang=american_america.CL8MSWIN1251
sqlldr scott/[email protected] control=us_citiesus_cities.ctl data=us_citiesus_cities.dat

Я считаю этот вариант наиболее предпочтительным.

3. Если это Windows, то можно изменить глобальные настройки NLS. Сделать это можно в реестре в веточке

Нужно будет вместо значения RUSSIAN_RUSSIA.CL8MSWIN1251 прописать AMERICAN_AMERICA.CL8MSWIN1251.

READ  Socket error 10060 epochta

Это решение может очень сильно повлиять на систему в целом. Действие этого параметра может повлечь неработоспособность другого приложения.

Я запустил sql-запрос в oracle sql-разработчике, и он работает отлично, но когда я использую оболочку, в данном случае adodb в excel vba, для выполнения того же запроса я получаю сообщение об ошибке. Я подозреваю, что adodb использует другую версию oracle, и оптимизация выполняется по-разному.

Я выполнил запрос: select (LATITUDE) from db where sin(LATITUDE)

Я получаю сообщение об ошибке:

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

ORA-02063: предыдущая строка из db

Если я изменяю sin(LATITUDE) в запросе:

LATITUDE (он не работает)

LATITUDE (он работает)

sin(LATITUDE) (он не работает)

to_number(sin(LATITUDE)) (он не работает)

sin(to_number(LATITUDE)) (он не работает)

Я также попробовал придать LATITUDE плавучесть, и это тоже не сработает. Единственный экземпляр, где он выполняется, — это без SIN и с одинарными кавычками вокруг плавающего значения справа от условия.

Я в недоумении относительно того, почему я не могу заставить запрос работать без каких-либо ошибок, хотя он отлично работает в Oracle SQL Developer. Любая помощь будет оценена по достоинству.

Таким образом, кажется, что LATITUDE хранится как число, а некоторые из значений не являются числовыми.

Возможно, такой запрос поможет вам разобраться в проблеме:

Это не идеальный тест, но он часто работает.

Лучший метод использует регулярные выражения:

Следуя следствию в комментариях, это, по-видимому, является разницей в настройке NLS между прямым SQL-клиентом и ADODB-соединением. Поскольку вы храните число в виде строки (которая всегда является плохим идеей), а число имеет десятичный разделитель, разные настройки NLS_NUMERIC_CHARACTERS вызывают ошибку в одном месте, но не в другом.

Oracle использует этот параметр NLS при неявном преобразовании из строки в число или если у вас есть явный to_number() без маски формата. Поэтому в любой среде одно из этих операторов будет работать, а другое получит ошибку ORA-01722:

Который не работает, зависит от настройки NLS. Вы можете использовать явную маску формата, чтобы избежать этого, и третий параметр to_number() чтобы сказать, как его интерпретировать:

Это использует маркер разделителя D дециметров, который соответствует первому символу в переопределении NLS — обратите внимание, что переключатель периода и запятой между этими двумя операторами — и что переопределение NLS должно быть установлено в соответствии с вашими фактическими данными. Вам также необходимо использовать соответствующие цифры цифр до и после десятичной точки.

В предположении, что вы имеете дело с десятичными градусами, вы должны иметь возможность использовать:

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

Но вам также нужно сделать это явное преобразование везде, где вы ссылаетесь на него, например:

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

Более ранний ответ дал вариацию Гордону Линоффу, но оказался красной селедкой.

Базы данных

ORA-01722: неправильный номер

Причина:

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

Действие:

Проверьте символьные строки в функции или в выражении; убедитесь в том, что они содержат только числа, знаки, десятичные точки, и символ «E» или «e», затем повторите операцию.

Источник

Smartadm.ru