В моей таблице «Группа» у меня нет имени = Джон, поэтому я хочу получить значение NULL в «новое_имя».
SELECT name INTO new_name FROM Group WHERE name = "John";
в пл/sql:
if (new_name IS NULL) then ---here is the problem,I can't enter in "if",instead of having name=NULL, I have name = " ",and when I try to use if (new_name = " "), there's an error....---
some code .....
end if;
Итак, как проверить в сатименте «если», это NULL или нет (нет необходимости использовать EXISTS)?
Похоже, у вас не NULL, а пробел; если это то, что вы говорите, то вы должны заключить это в одинарные кавычки:
if new_name = ' ' then ...
Однако: вернемся к началу. Если нет строки, чья name = 'John'
, то select
не вернет null
, а вызовет исключение no_data_found
, которое вы должны каким-то образом обработать.
Один из вариантов - на самом деле «обработать» его:
begin
begin
select name into new_name from group where name = 'John';
exception
when no_data_found then new_name := null;
end;
if new_name is null then
some code ...
end if;
end;
Или, если вы используете агрегат, вы избежите раздела обработки исключений (что означает «меньше ввода», но это как бы скрывает то, что происходит):
begin
select max(name) into new_name from group where name = 'John';
if new_name is null then
some code ...
end if;
end;
Я предлагаю вам справиться с этим должным образом.
Простой метод заключается в использовании агрегации:
SELECT MAX(name) INTO new_name
FROM Group
WHERE name = 'John';
Запрос агрегации без GROUP BY
гарантированно возвращает одну строку. Если все строки отфильтрованы, то результаты агрегации будут NULL
.
ваше условие IF должно быть в порядке, но, как упоминал Littlefoot, ваша логика никогда не будет удовлетворять вашему условию If, поскольку NAME всегда будет не NULL.
Вы также можете использовать NVL(), если хотите присвоить значения в своей переменной new_name, отличные от NULL, а затем использовать это в своем условии IF.