Подтвердить что ты не робот

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;
4b9b3361

Ответ 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;