Вопрос по ora-01722, oracle, sql – Могу ли я передать номер для varchar2 в Oracle?

5

У меня есть таблица Oracle и столбец (col1) имеет типvarchar2(12 byte), Имеет один ряд и значениеcol1 является1234

Когда я сказал

select * from table where col1 = 1234

Оракул говорит неверный номер. Это почему? Почему я не могу передать число, когда оноvarchar2?

РЕДАКТИРОВАТЬ: Все ответы великолепны. Спасибо. Но я не могу понять, почему он не принимает1234 когда1234 является действительным типом данных varchar2.

Ваш Ответ

3   ответа
4

en it is varchar2?

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

Кроме того, вы предполагаете, что1234 этоonly строка, которая извлекается. В действительности, Oracle должен извлечь все строки из таблицы, а затем отфильтровать согласноwhere пункт. Теперь значение символа вcol1 который выбирается до того, как он встретит вас1234 строка & amp; это вызывает ошибку, поскольку символ не может быть преобразован в число.

Это скрипка показывает поведение. посколькуabc не может быть преобразован в число, вы получите это сообщение об ошибке

Теперь, еслиonly запись в таблице соответствует записи col1, содержащей числовой символ, вы увидите, чтозаявление будет работать нормально

Благодарю. очень хорошее объяснение Victor
5

что вы ожидаете, что Oracle неявно приведёт 1234 к символьному типу. Наоборот, Oracle неявно преобразует столбец в число. В столбце есть нечисловое значение, поэтому Oracle выдает ошибку.Документация Oracle предостерегает от неявных приведений непосредственно перед тем, как объяснить, как они будут разрешены. Правило, которое объясняет поведение, которое вы видите:

When comparing a character value with a numeric value, Oracle converts the character data to a numeric value.

Благодарю. таким образом, символ 1234, который оракул неявно преобразует в число. ТАК почему ошибка с 1234 является действительным числом? Victor
Что-то в таблице не является числом. Оракул оставляет 1234 как число. Он пытается преобразовать значение в столбце для соответствия. Когда он находит значение, которое не является числом, он выдает ошибку.
4

select *
from table
where col1 = to_char(1234)

Когда col1 не похож на число, to_number возвращает ошибку, останавливая запрос.

Похожие вопросы