Несоответствующая ошибка ORA-01722: неверный номер - PullRequest
0 голосов
/ 15 мая 2018

Я получил сообщение об ошибке «ORA-01722: неверный номер», когда выполнил свой запрос.Как выяснилось, я обнаружил, что получу эту ошибку, когда использую числовое значение для столбца, который ожидает varchar.В моем случае в моем запросе был оператор case типа

CASE WHEN CHAR_COLUMN= 1 THEN 'SOME VALUE' END

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

PS: версия оракула, которую мы используемis Oracle Database 11g Express Edition, выпуск 11.2.0.2.0 - 64-разрядная версия

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

К воспроизвести проблему :

create table foo (
  CHAR_COLUMN varchar2(10)
);
create table bar (
  CHAR_COLUMN varchar2(10)
);
insert into foo (CHAR_COLUMN) values ('1');
insert into foo (CHAR_COLUMN) values ('2');
insert into bar (CHAR_COLUMN) values ('1');
insert into bar (CHAR_COLUMN) values ('yellow');

Затем при запросе числового значения 1 первая таблица запросов работает, а вторая - нет:

select * from foo where CHAR_COLUMN = 1;
select * from bar where CHAR_COLUMN = 1;

Когда вы просите Oracle разрешить это сравнение:

WHEN CHAR_COLUMN = 1

... Oracle внутренне преобразует запрос в:

WHEN TO_NUMBER(CHAR_COLUMN) = 1

В моем примере это можно заметить в плане объяснения:

---------------------------------------------------------------------
| Id  | Operation           | Name | Rows | Bytes | Cost | Time     |
---------------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |    1 |     7 |    3 | 00:00:01 |
| * 1 |   TABLE ACCESS FULL | FOO  |    1 |     7 |    3 | 00:00:01 |
---------------------------------------------------------------------

Predicate Information (identified by operation id):
------------------------------------------
* 1 - filter(TO_NUMBER("CHAR_COLUMN")=1)
0 голосов
/ 15 мая 2018

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

CASE WHEN CHAR_COLUMN = TO_CHAR(1) THEN 'SOME VALUE' END

Или даже не конвертирую вообще:

CASE WHEN CHAR_COLUMN = '1' THEN 'SOME VALUE' END

Причинав том, что Oracle стремится преобразовать символьную строку в число, а не наоборот.См. Пример на связанной странице руководства:

Пример текстового литерала

Текстовый литерал '10' имеет тип данных CHAR.Oracle неявно преобразует его в тип данных NUMBER, если он появляется в числовом выражении, как в следующем выражении:

SELECT salary + '10'
  FROM employees;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...