Как правильно проверить, пуст ли varchar2?

Согласно официальной документации 11g

В настоящее время Oracle Database обрабатывает символьное значение нулевой длины как null. Однако это может измениться в будущих выпусках, и Oracle рекомендует не обрабатывать пустые строки так же, как пустые значения.

Рассмотрим функцию getVersion, которая возвращает тип varchar2, который может быть '':

l_version := x.getVersion;
if l_version is null then
  return 'V.1.0';
end if;

Это будет правильно работать в текущей версии Oracle 11g, но может сломаться, как только будущие версии Oracle будут обрабатывать '' иначе, чем null.

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

if l_version is null or l_version = '' then

Есть ли менее громоздкий способ?


person Roland    schedule 27.05.2015    source источник
comment
я также следую тому же, если l_version имеет значение null или l_version = '', тогда   -  person Sachu    schedule 27.05.2015
comment
@Alex Да, конечно, ты прав. Я дурачился с этим комментарием :/ Я удалю его в кратчайшие сроки...   -  person Sylvain Leroux    schedule 27.05.2015


Ответы (3)


Предполагая, что вы используете varchar2 во всем своем коде, l_version is null будет подтверждением будущего.

Oracle создала тип данных varchar2, когда стандарты ANSI объявили, что varchar должен обрабатывать NULL и пустую строку как отдельные объекты. Намерение состояло в том, чтобы поведение типа данных varchar2 оставалось постоянным в будущем, в то время как varchar в будущем мог бы использовать новую стандартную семантику сравнения NULL. Конечно, сегодня varchar и varchar2 являются синонимами друг друга, и так было по крайней мере пару десятилетий, поэтому вероятность того, что Oracle действительно изменит поведение типа данных varchar в будущем, довольно низка.

Если вы посмотрите на документацию для типов данных VARCHAR2 и VARCHAR, в нем говорится о семантике сравнения для VARCHAR, которая может измениться в будущем. К сожалению, не указано явно, что семантика сравнения, о которой они говорят, представляет собой эквивалентность (или ее отсутствие) между NULL и пустой строкой. Но поскольку VARCHAR является типом данных стандарта ANSI, и единственная разница в семантике сравнения VARCHAR между Oracle и стандартом ANSI заключается в том, является ли пустая строка NULL, это общепринятая интерпретация.

Не используйте тип данных VARCHAR. Вместо этого используйте тип данных VARCHAR2. Хотя тип данных VARCHAR в настоящее время является синонимом VARCHAR2, планируется, что тип данных VARCHAR будет переопределен как отдельный тип данных, используемый для символьных строк переменной длины, по сравнению с другой семантикой сравнения.

person Justin Cave    schedule 27.05.2015

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

Кроме того, в настоящее время в базах данных Oracle по всему миру хранится около 100 миллиардов триллионов нулевых строк, которые по-прежнему будут нулевыми.

Поэтому мой совет — забудьте об этом и просто используйте IS NULL.

person David Aldridge    schedule 27.05.2015
comment
В моем конкретном примере я не хочу различать. Если getVersion возвращает null или пустое varchar2, я заполню жестко заданное значение по умолчанию (см. код в вопросе). - person Roland; 28.05.2015
comment
Конечно, я просто нацелен на более широкую проблему. - person David Aldridge; 28.05.2015

Похоже, юрист залез в документацию Oracle. Я не могу представить, что через миллион лет Oracle внезапно изменит то, как они обрабатывают пустые строки с помощью varchar2, ТОННА кода сломается (и большая часть этого молча). Это утверждение в документах выглядит как «прикрой свои $$» на всякий случай. Итак, просто продолжайте использовать "is null" и не беспокойтесь. Во всяком случае, они изменят поведение varchar, а не varchar2.

Мои 2 цента в любом случае.

person tbone    schedule 27.05.2015