loc
- столбец Варчара.
[Из комментария] Столбец Loc имеет значение типа char также как GJ, 3KT1
LOC
содержит значения, которые нельзя преобразовать в числа. Это важно, поскольку предикаты вашего предложения WHERE определены как числа, поэтому Oracle применяет к запросу неявный to_number(loc)
. Вот почему использование правильных типов данных является наилучшей практикой: сейчас это не поможет, но, пожалуйста, усвойте урок и используйте столбцы NUMBER для числовых данных.
Тем временем у вас есть несколько вариантов работы с вашей тонкой моделью данных.
Если вам посчастливилось использовать Oracle 12c R2, вы можете использовать новую функцию VALIDATE_CONVERSION()
, чтобы исключить значения loc
, которые нельзя привести к числам. Узнать больше
Если вы используете более раннюю версию Oracle, вы можете создать свою собственную функцию:
create or replace function is_number
(p_str in varchar2) return number
is
n number;
rv number;
begin
begin
n := to_number(p_str);
rv := 1;
exception
when invalid_number then
rv := 0;
end;
return rv;
end;
Самым слабым вариантом будет приведение предикатов к строкам. where loc between '300' to '400'
будет включать '3000'
, '4'
и различные другие значения, которые вы, вероятно, не хотите.
Вот демонстрационная версия LiveSQL (требуется бесплатная учетная запись Oracle Technet, увы) .