Ja, u kunt SQL%ROWCOUNT
gebruiken . Het is geldig in PL/SQL.
In PL/SQL moet het resultaat van uw zoekopdracht echter ergens heen gaan, b.v. in een PL/SQL-tabel. PL/SQL zal het resultaat nooit naar de output sturen (terminal, venster enz.). Dus SELECT * FROM
zal niet werken.
Uw code kan er als volgt uitzien:
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;
/
Bijwerken :
De bijgewerkte vragen suggereren dat u op zoek bent naar iets anders.
Optie 1:Gebruik uitzonderingen
Als er 0 rijen of meer dan 1 rij zijn, worden deze gevallen afzonderlijk behandeld (als fouten):
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;
Optie 2:gebruik aggregaties
Met behulp van aggregaties zal de query altijd precies één rij retourneren. Als de bronrij nu overeenkomt met de WHERE-component, zijn beide resultaatwaarden NULL. Als de WHERE-clausule overeenkomt met meer dan één rij, wordt het maximum genomen.
Houd er rekening mee dat deze zoekopdracht een poortnummer en een IP-adres kan retourneren die oorspronkelijk niet op dezelfde rij stonden.
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;
Optie 3:ROWNUM gebruiken
Deze query retourneert maximaal één rij. Als geen enkele rij overeenkomt met de WHERE-component, wordt er een uitzondering gegenereerd die moet worden afgehandeld:
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;