Sim, você pode usar
SQL%ROWCOUNT
. É válido em PL/SQL. No entanto, em PL/SQL, o resultado da sua consulta precisa ir para algum lugar, por exemplo. em uma tabela PL/SQL. PL/SQL nunca enviará o resultado para a saída (terminal, janela etc.). Então
SELECT * FROM
não vai funcionar. Seu código pode ficar assim:
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;
/
Atualizar :
As perguntas atualizadas sugerem que você está procurando outra coisa.
Opção 1:use exceções
Se houver 0 linhas ou mais de 1 linha, esses casos serão tratados separadamente (como erros):
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;
Opção 2:usar agregações
Usando agregações, a consulta sempre retornará exatamente uma linha. Se agora a linha de origem corresponder à cláusula WHERE, ambos os valores de resultado serão NULL. Se a cláusula WHERE corresponder a mais de uma linha, o máximo será obtido.
Observe que essa consulta pode retornar um número de porta e um endereço IP que originalmente não estavam na mesma linha.
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;
Opção 3:use ROWNUM
Esta consulta retorna no máximo uma linha. Se nenhuma linha corresponder à cláusula WHERE, uma exceção será lançada e precisará ser tratada:
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;