Работа с пустыми строками в PL/SQL - Null или не NULL?

Одна из причин постоянных недоразумений при разработке кода на PL/SQL — особенно для тех программистов, которые перешли к Oracle от других СУБД и языков программирования, — заключается в том, что Oracle интерпретирует пустые строки как значение NULL. Это противоречит стандарту ISO SQL, в котором проводятся четкие различия между пустой строкой и строковой переменной, имеющей значение NULL:

/* Файл в Сети: empty_is_null.sql */
DECLARE
empty_varchar2 VARCHAR2(10) := '';
empty_char CHAR(10) := '';
BEGIN
IF empty_varchar2 IS NULL THEN
DBMS_OUTPUT.PUT_LINE('empty_varchar2 is NULL');
END IF;
IF '' IS NULL THEN
DBMS_OUTPUT.PUT_LINE(''''' is NULL');
END IF;
IF empty_char IS NULL THEN
DBMS_OUTPUT.PUT_LINE('empty_char is NULL');
ELSIF empty_char IS NOT NULL THEN
DBMS_OUTPUT.PUT_LINE('empty_char is NOT NULL');
END IF;
END;

Результат:

empty_varchar2 is NULL
'' is NULL
empty_char is NOT NULL 

Данный пример показывает, что переменная типа CHAR не интерпретируется как NULL. Дело в том, что переменные CHAR как строки фиксированной длины в принципе не бывают пустыми. В приведенном примере она просто заполняется пробелами до длины 10 символов. А вот переменная VARCHAR2 равна NULL, поскольку ей присваивается строковый литерал нулевой длины.

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

DECLARE
user_entered_name VARCHAR2(30);
name_from_database VARCHAR2(30);
...
BEGIN
...
IF user_entered_name <> name_from_database THEN
...

Если пользователь введет пустую строку вместо имени, результат проверки условия IF никогда не будет равным TRUE, поскольку значение NULL не бывает равным (или не равным) никакому другому значению. Альтернативный способ записи данного оператора IF выглядит так:

IF (user_entered_name <> name_from_database)
OR (user_entered_name IS NULL) THEN

Это всего лишь один из способов решения проблемы равенства NULL пустой строки; он подходит не для каждой ситуации. В общем случае постарайтесь понять, чего вы пытаетесь добиться, учтите, что пустые строки будут интерпретироваться как NULL, и напишите соответствующий код.

 

Вас заинтересует / Intresting for you:

Встроенные методы коллекций PL...
Встроенные методы коллекций PL... 7008 просмотров sepia Tue, 29 Oct 2019, 09:54:01
Управление приложениями PL/SQL...
Управление приложениями PL/SQL... 3110 просмотров Stas Belkov Thu, 16 Jul 2020, 06:20:48
Команда NULL языка PL/SQL на п...
Команда NULL языка PL/SQL на п... 1721 просмотров Ирина Светлова Wed, 24 Jan 2018, 09:00:26
Тип данных RAW в PL/SQL
Тип данных RAW в PL/SQL 5746 просмотров Doctor Thu, 12 Jul 2018, 08:41:33
Войдите чтобы комментировать

ildergun аватар
ildergun ответил в теме #9079 09 июнь 2018 09:30
Null или не NULL - вот в чем вопрос! Вот о чем думаю программисты PL/SQL на работе, на досуге и просто так от скуки!))