Одна из причин постоянных недоразумений при разработке кода на 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
, и напишите соответствующий код.