Ja, du kan bruge SQL%ROWCOUNT
. Det er gyldigt i PL/SQL.
Men i PL/SQL skal resultatet af din forespørgsel hen et sted, f.eks. ind i en PL/SQL-tabel. PL/SQL sender aldrig resultatet til output (terminal, vindue osv.). Så SELECT * FROM
virker ikke.
Din kode kunne se sådan ud:
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;
/
Opdater :
De opdaterede spørgsmål tyder på, at du leder efter noget andet.
Mulighed 1:Brug undtagelser
Hvis der er 0 rækker eller mere end 1 række, håndteres disse sager separat (som fejl):
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;
Mulighed 2:Brug sammenlægninger
Ved at bruge aggregeringer vil forespørgslen altid returnere præcis én række. Hvis nu kilderækken matchede WHERE-udtrykket, vil begge resultatværdier være NULL. Hvis der WHERE-sætning matchede mere end én række, tages maksimum.
Bemærk, at denne forespørgsel muligvis returnerer et portnummer og en IP-adresse, der oprindeligt ikke var på samme række.
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;
Mulighed 3:Brug ROWNUM
Denne forespørgsel returnerer højst én række. Hvis ingen række matcher WHERE-sætningen, er der en undtagelse, som skal håndteres:
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;