Ano, můžete použít SQL%ROWCOUNT
. Je platný v PL/SQL.
V PL/SQL však musí výsledek vašeho dotazu někam směřovat, např. do PL/SQL tabulky. PL/SQL nikdy nepošle výsledek na výstup (terminál, okno atd.). Takže SELECT * FROM
nebude fungovat.
Váš kód může vypadat takto:
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;
/
Aktualizovat :
Aktualizované otázky naznačují, že hledáte něco jiného.
Možnost 1:Použít výjimky
Pokud existuje 0 řádků nebo více než 1 řádek, jsou tyto případy řešeny samostatně (jako chyby):
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;
Možnost 2:Použijte agregace
Pomocí agregací dotaz vrátí vždy přesně jeden řádek. Pokud nyní zdrojový řádek odpovídá klauzuli WHERE, budou obě výsledné hodnoty NULL. Pokud klauzule WHERE odpovídá více než jednomu řádku, bude použito maximum.
Upozorňujeme, že tento dotaz může vrátit číslo portu a IP adresu, které původně nebyly na stejném řádku.
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;
Možnost 3:Použijte ROWNUM
Tento dotaz vrátí nejvýše jeden řádek. Pokud žádný řádek neodpovídá klauzuli WHERE, je vyvolána výjimka a je třeba ji zpracovat:
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;