Oui, vous pouvez utiliser SQL%ROWCOUNT
. C'est valide en PL/SQL.
Cependant, en PL/SQL, le résultat de votre requête doit aller quelque part, par exemple. dans une table PL/SQL. PL/SQL n'enverra jamais le résultat à la sortie (borne, fenêtre, etc.). Donc SELECT * FROM
ne fonctionnera pas.
Votre code pourrait ressembler à ceci :
DECLARE
TYPE emp_t ...;
emp_tab emp_t;
BEGIN
SELECT *
BULK COLLECT INTO emp_tab
FROM emp
WHERE empname = 'Justin' AND dept='IT';
IF sql%rowcount > 0 THEN
.. do something ...
END IF;
END;
/
Mettre à jour :
Les questions mises à jour suggèrent que vous cherchez autre chose.
Option 1 :Utiliser des exceptions
S'il y a 0 ligne ou plus d'une ligne, ces cas sont traités séparément (comme des erreurs) :
BEGIN
select PORT_NUMBER,STATIC_IP into outport, outIP
from TINST
where INST_ID = in_Hid AND IP_PORT_STATUS = 'Y';
EXCEPTION
WHEN NO_DATA_FOUND THEN
outretvalue := -12;
RETURN;
WHEN TOO_MANY_ROWS THEN
outretvalue := -13;
RETURN;
END;
Option 2 :Utiliser des agrégations
En utilisant des agrégations, la requête renverra toujours exactement une ligne. Si maintenant la ligne source correspond à la clause WHERE, les deux valeurs de résultat seront NULL. Si la clause WHERE correspond à plus d'une ligne, le maximum sera pris.
Notez que cette requête peut renvoyer un numéro de port et une adresse IP qui, à l'origine, n'étaient pas sur la même ligne.
select MAX(PORT_NUMBER), MAX(STATIC_IP) into outport, outIP
from TINST
where INST_ID = in_Hid AND IP_PORT_STATUS = 'Y';
IF outport IS NULL OR outIP IS NULL THEN
outretvalue := -12;
RETURN;
END IF;
Option 3 :Utiliser ROWNUM
Cette requête renvoie au plus une ligne. Si aucune ligne ne correspond à la clause WHERE, une exception est levée et doit être gérée :
BEGIN
select PORT_NUMBER, STATIC_IP into outport, outIP
from TINST
where INST_ID = in_Hid AND IP_PORT_STATUS = 'Y'
AND ROWNUM = 1;
EXCEPTION
WHEN NO_DATA_FOUND THEN
outretvalue := -12;
RETURN;
END;