Я хочу проверить, является ли переменная пустой. Если это является пустым, то я хочу установить значение к той переменной:
//data type of var is number
if Var = null then
var :=5;
endif
Но я получаю ошибку в нем. Как я могу проверить, является ли переменная пустой?
Я использую тип данных оракула
Use:
IF Var IS NULL THEN
var := 5;
ENDIF;
Oracle 9i+:
var = COALESCE(Var, 5)
Other alternatives:
var = NVL(var, 5)
Reference:
В PL/SQL нельзя использовать операторы типа '=' или '<>' для проверки на наличие NULL
, так как все сравнения с NULL
возвращают NULL
. Для сравнения чего-либо с NULL
необходимо использовать специальные операторы IS NULL
или IS NOT NULL
, которые существуют именно для этой цели. Таким образом, вместо записи
IF var = NULL THEN...
необходимо записать
IF VAR IS NULL THEN...
В том случае, если Вы дали возможность использовать также встроенную функцию NVL
. NVL
принимает два аргумента, первый из которых является переменной, а второй - значением (константным или вычисленным). NVL
смотрит на свой первый аргумент и, если обнаруживает, что первым аргументом является NULL
, возвращает второй. Если первый аргумент к NVL
не является NULL
, возвращается первый аргумент. Так что вы можете переписать
IF var IS NULL THEN
var := 5;
END IF;
как
var := NVL(var, 5);
Я надеюсь это поможет.
И так как прошло уже почти десять лет с тех пор как я написал этот ответ, давайте отпразднуем это, немного расширив его.
Функция COALESCE
является ANSI-эквивалентом Oracle's NVL
. Она отличается от NVL
парой хороших способов IMO:
Она берет любое количество аргументов и возвращает первый, который не является NULL. Если все аргументы, переданные в COALESCE
, являются NULL, то он возвращает NULL.
В отличие от NVL
, COALESCE
только аргументы, если должен, в то время как NVL
оценивает оба своих аргумента, а затем определяет, является ли первый NULL и т.д. Таким образом, COALESCE
может быть более эффективным, так как не тратит время на оценку вещей, которые не будут использоваться (и которые потенциально могут вызвать нежелательные побочные эффекты), но это также означает, что COALESCE
не является дроп-ин-заменой для NVL
.
Всегда помните о том, чтобы быть осторожным с нулями в условных клаузулах pl/sql, так как ноль никогда не бывает больше, меньше, равна или неравна чему-либо. Лучший способ избежать их - использовать nvl.
Например
declare
i integer;
begin
if i <> 1 then
i:=1;
foobar();
end if;
end;
/
Never goes in the if clause.
These would work.
if 1<>nvl(i,1) then
if i<> 1 or i is null then
Другой способ:
var := coalesce (var, 5);
COALESCE является ANSI-эквивалентом (более или менее) NVL функции Oracle.
.