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;
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;
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.
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;
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;