Да, можете да използвате SQL%ROWCOUNT
. Валиден е в PL/SQL.
В PL/SQL обаче резултатът от вашата заявка трябва да отиде някъде, напр. в PL/SQL таблица. PL/SQL никога няма да изпрати резултата до изход (терминал, прозорец и др.). Така че SELECT * FROM
няма да работи.
Вашият код може да изглежда така:
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;
/
Актуализация :
Актуализираните въпроси предполагат, че търсите нещо друго.
Опция 1:Използвайте изключения
Ако има 0 реда или повече от 1 ред, тези случаи се обработват отделно (като грешки):
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;
Вариант 2:Използвайте агрегирания
Използвайки агрегати, заявката винаги ще връща точно един ред. Ако сега редът източник съответства на клаузата WHERE, тогава и двете резултатни стойности ще бъдат NULL. Ако клаузата WHERE съответства на повече от един ред, ще бъде взет максимумът.
Имайте предвид, че тази заявка може да върне номер на порт и IP адрес, които първоначално не са били на един и същи ред.
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;
Опция 3:Използвайте ROWNUM
Тази заявка връща най-много един ред. Ако нито един ред не съответства на клаузата WHERE, се хвърля изключение и трябва да бъде обработено:
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;