PL/SQL проверяет, возвращает ли запрос пустой
Я пишу процедуру, и мне нужно проверить, вернул ли мой запрос select пустую запись или нет.
(В этом примере отсутствует ли полка x, y)
Как я могу это сделать?
Я пробовал это:
temp shelves.loadability%TYPE := NULL;
BEGIN
select loadability into temp from shelves where rownumber = x and columnnumber = y;
IF temp IS NOT NULL THEN
/* do something when it not empty */
ELSE
/* do the other thing when it empty */
END IF;
Но вторая ветка if никогда не работает...
EDIT:
О, это было так просто...
temp shelves.loadability%TYPE;
BEGIN
select count(*) into temp from shelves where rownumber = x and columnnumber = y;
IF temp != 0 THEN
/* do something when it not empty */
ELSE
/* do the other thing when it empty */
END IF;
END;
Ответы
Ответ 1
Использовать обработчик исключений
Begin
select column
into variable
from table
where ...;
-- Do something with your variable
exception
when no_data_found then
-- Your query returned no rows --
when too_many_rows
-- Your query returned more than 1 row --
end;
Ответ 2
Как правило, больше SQL-подобных просто выполняет работу для существующих записей. Другими словами, вы можете выполнить свою задачу для каждого совпадения, и если нет вхождений, вы этого не делаете. Таким образом, вам даже не понадобится конструкция IF-ELSE.
Я не буду рекомендовать использовать курсор для выполнения работы, потому что это будет противоречить моему первому предложению о том, что вы сделаете это более похожим на SQL. Но если вам нужно это сделать, то курсор может сделать то, что вы хотите.
И да, я понимаю, что не отвечает на ваш вопрос напрямую.
Ответ 3
Обработка исключений будет первым, о чем я думаю, но если вы не хотите обременять себя обработкой всех разных случаев, я склонен использовать select count(*) from
. Хорошая вещь с count (*) заключается в том, что она ВСЕГДА возвращает что-то (при условии, что ваш запрос является законным). В этом случае вы можете подсчитать, будет ли он возвращать 0 (нет совпадений) или больше (в этом случае вы можете что-то сделать.
Вы можете получить что-то вроде этого:
declare
v_count number := 0;
begin
select count(*) into v_count from table where condition;
if v_count = 0 then
--do something
else
--do something else
end if;
end;
Ответ 4
уловить первое недопустимое условие и использовать count (1), потому что count (*) на самом деле пытается подсчитать что-то и добавить rownum = 1, вам нужно только одно первое не соответствующее условию. Я использую это утверждение.
declare
v_check number;
begin
select count(1) into v_check
from table
where condition(something not wanted) AND rownum=1;
if v_check = 0 then
--do something else
elsif v_check = 1 --dont want theat
rise some error or more..
end if;
end;
Для вас просто
select count(1) into v_check from dual where exists (select count(1)
from table
where condition AND rownum=1);
if v_check = 0 then --nothing found
something...
elsif v_check = 1 --found something
something...
end if;
end;