PL / SQL检查查询是否返回空

时间:2011-05-10 19:00:24

标签: plsql

我正在写一个程序,我需要检查我的选择查询是否返回空记录。 (在此示例中是否没有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's not empty */
ELSE
/* do the other thing when it's empty */
END IF;

但if的第二个分支从不起作用......

修改

哦,这太容易了......

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's not empty */
ELSE
/* do the other thing when it's empty */
END IF;

END;

4 个答案:

答案 0 :(得分:15)

使用异常处理程序

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;

答案 1 :(得分:3)

对于存在的记录,通常更像SQL。换句话说,您可以为匹配的每次匹配执行任务,如果没有发生,则不执行此操作。所以你甚至不需要IF-ELSE结构。

我不建议使用游标来完成这项工作,因为这与我的第一个建议相反,即你做的更像SQL。但如果你必须这样做,那么光标可能会做你想要的。

是的,我知道这不会直接回答你的问题。

答案 2 :(得分:2)

异常处理也是我想到的第一件事,但如果你不想让自己负担处理所有不同的情况,我倾向于使用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;

答案 3 :(得分:0)

首先捕获不想要的条件并使用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;