DeepEdit!

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

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

Условия NULL

Последовательность операторов в операторе IF-THEN-ELSE выполняется только в случае истинности соответствующего условия. Если результатом условия является FALSE или NULL, последовательность операторов не выполняется. В качестве примера рассмотрим два блока:
Одинаково ли будут вести себя эти два блока? Предположим, что v Numberl = 3, a v_Number2 = 7. В результате условие блока 1 (3 < 7) будет ис­тинным, и переменная v_Result будет установлена в 'Yes'. Условие блока 2 будет ложным (3 >= 7), переменная vResult также будет установлена в 'Yes'. Для любых значений v_Number1 и v_Number2, не являющихся NULL, приведенные блоки функционируют одинаково.
Теперь предположим, что vjlumberl = 3, a v_Number2 содержит NULL. Что произойдет в этом случае? Условие блока 1 (3 < NULL) дает в резуль­тате NULL, поэтому будет выполнено условие ELSE и переменной v_Re-sult будет присвоено значение 'No'. Условие блока 2 (3 >= NULL ) также дает в результате NULL, поэтому будет выполнено условие ELSE и переменной        будет присвоено значение. Если одна из переменных (v_Number1 или v_Number2) содержит NULL, то блоки функциони­руют по-разному.
Можно сделать так, чтобы блоки функционировали одинаково. Для этого следует ввести проверку на наличие NULL:

Условие IS NULL истинно только тогда, когда проверяемая переменная содержит NULL-значение. В противном случае условие ложно. После до­бавления в блоки проверки на наличие NULL переменная v_Result будет принимать значение 'Unknown' (неизвестно), если одна из переменных v_Number содержит NULL- значение. Сравнение переменных v_Numberl и v_Number2 будет выполняться только в том случае, если точно известно, что обе переменные не содержат NULL- значений; при этом блоки будут функционировать одинаково.
CASE
Во многих случаях блок IF-THEN-ELSE используется для выполнения различных операторов в зависимости от значения входной переменной. Например, рассмотрим блок, который выбирает курс для студента на основе его специализации:
Этот код последовательно сравнивает значение переменной v_Major в различных операторах ELSIF. Oraclе9 г предоставляет упрощенную конст­рукцию, которая выполняет то же самое. Это оператор CASE. Аналогич­но оператору переключателя в С, CASE имеет следующую структуру:
CASE test_var
WHEN значение_1 THEN последовательность_операторов_1\ WHEN значение_2 THEN последователъностъ_операторов_2;
WHEN значение_п THEN последователъность_операторов__п; [ELSE последователъностъ_еке;] END CASE;
где        проверяемая переменная или выражение,
сравниваемые значения, а последовательность_операторов_, ... последователъностъ_операторов_п— соответствующий код для выполнения. Если testvar равна, например, значению_2, будет выполняться последователъ-ность_операторов_2. Если ни одно из значений не совпадает, выполняется код последовательности.
Можно переписать наш пример с помощью CASE:
Внимание
I Элемент test_vaг, используемый в операторе CASE, может быть не только переменной, как в примере выше. Это может быть выражение произвольной сложности, содержащее вызовы функций. В любом случае test_va г оценивается только один раз, в начале выполнения оператора CASE. Более того, типы значений_1... п должны быть совместимы с типом testvar.
После выполнения заданной последовательности операторов управле­ние немедленно передается оператору, следующему за CASE. He требуется использовать оператор break, как в случае переключателя С.

 









jAntivirus