Tak, możesz użyć SQL%ROWCOUNT
. Działa w PL/SQL.
Jednak w PL/SQL wynik Twojego zapytania musi gdzieś trafić. do tabeli PL/SQL. PL/SQL nigdy nie wyśle wyniku do wyjścia (terminal, okno itp.). Więc SELECT * FROM
nie zadziała.
Twój kod może wyglądać tak:
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;
/
Aktualizacja :
Zaktualizowane pytania sugerują, że szukasz czegoś innego.
Opcja 1:Użyj wyjątków
Jeśli jest 0 wierszy lub więcej niż 1, te przypadki są obsługiwane osobno (jako błędy):
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;
Opcja 2:użyj agregacji
Używając agregacji, zapytanie zawsze zwróci dokładnie jeden wiersz. Jeśli teraz wiersz źródłowy pasuje do klauzuli WHERE, obie wartości wyników będą miały wartość NULL. Jeśli klauzula WHERE pasuje do więcej niż jednego wiersza, zostanie przyjęte maksimum.
Pamiętaj, że to zapytanie może zwrócić numer portu i adres IP, które pierwotnie nie znajdowały się w tym samym wierszu.
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;
Opcja 3:Użyj ROWNUM
To zapytanie zwraca co najwyżej jeden wiersz. Jeśli żaden wiersz nie pasuje do klauzuli WHERE, zgłaszany jest wyjątek, który wymaga obsługi:
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;