web-dev-qa-db-fra.com

Vérification PL/SQL si la requête retourne vide

J'écris une procédure, et je dois vérifier si ma requête de sélection a renvoyé un enregistrement vide ou non .

Comment puis je faire ça?

J'ai essayé ceci:

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;

Mais la deuxième branche du si ne fonctionne jamais ...

MODIFIER:

Oh, c'était si facile ...

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;
19
WonderCsabo

Utiliser un gestionnaire d'exceptions

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;
14
Rene

Généralement, il s’agit plus de SQL que de simplement faire le travail pour les enregistrements existants. En d'autres termes, vous pouvez effectuer votre tâche pour chaque occurrence de la correspondance, et s'il n'y a aucune occurrence, vous ne le faites pas. Ainsi, vous n’auriez même pas besoin de la construction IF-ELSE.

Je ne recommanderai pas l'utilisation d'un curseur pour effectuer le travail, car cela irait à l'encontre de ma première suggestion, à savoir que vous le fassiez davantage comme SQL. Mais si vous devez le faire de cette façon, un curseur peut faire ce que vous voulez.

Et oui, je réalise que cela ne répond pas directement à votre question.

3
MJB

La gestion des exceptions serait la première chose à laquelle je pense aussi, mais si vous ne voulez pas vous charger de la gestion de tous les cas, j’ai tendance à utiliser un select count(*) from. La bonne chose avec count (*) est qu'il renvoie TOUJOURS quelque chose (en supposant que votre requête est légale). Dans ce cas, vous pouvez compter pour voir s'il renvoie 0 (pas de correspondance) ou plus (auquel cas vous pouvez faire quelque chose.

Vous pourriez obtenir quelque chose comme ça:

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;
2
schwarz

attrapez d'abord la condition non voulue et utilisez count (1) car count (*) essayant réellement de compter quelque chose et d'ajouter rownum = 1, vous n'avez besoin que d'une première condition ne correspondant pas. J'utilise cette déclaration.

       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;

Pour toi juste 

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;
0
user2879235