Ja, du kan använda SQL%ROWCOUNT
. Det är giltigt i PL/SQL.
Men i PL/SQL måste resultatet av din fråga hamna någonstans, t.ex. till en PL/SQL-tabell. PL/SQL kommer aldrig att skicka resultatet till utgången (terminal, fönster etc.). Så SELECT * FROM
kommer inte att fungera.
Din kod kan se ut så här:
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;
/
Uppdatera :
De uppdaterade frågorna tyder på att du letar efter något annat.
Alternativ 1:Använd undantag
Om det finns 0 rader eller fler än 1 rad, hanteras dessa fall separat (som fel):
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;
Alternativ 2:Använd sammanställningar
Med hjälp av aggregationer kommer frågan alltid att returnera exakt en rad. Om nu källraden matchade WHERE-satsen, kommer båda resultatvärdena att vara NULL. Om WHERE-satsen matchade mer än en rad, kommer det maximala antalet att tas.
Observera att den här frågan kan returnera ett portnummer och en IP-adress som ursprungligen inte fanns på samma rad.
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;
Alternativ 3:Använd ROWNUM
Denna fråga returnerar högst en rad. Om ingen rad matchade WHERE-satsen, skapas ett undantag och måste hanteras:
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;