Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

É possível usar sql%rowcount para SELECT?


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;