Oracle
 sql >> Database >  >> RDS >> Oracle

È possibile utilizzare sql%rowcount per SELECT?

Sì, puoi utilizzare SQL%ROWCOUNT . È valido in PL/SQL.

Tuttavia, in PL/SQL il risultato della tua query deve andare da qualche parte, ad es. in una tabella PL/SQL. PL/SQL non invierà mai il risultato all'output (terminale, finestra ecc.). Quindi SELECT * FROM non funzionerà.

Il tuo codice potrebbe assomigliare a questo:

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;
/

Aggiorna :

Le domande aggiornate suggeriscono che stai cercando qualcos'altro.

Opzione 1:utilizza le eccezioni

Se sono presenti 0 righe o più di 1 riga, questi casi vengono gestiti separatamente (come errori):

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;

Opzione 2:utilizza le aggregazioni

Utilizzando le aggregazioni, la query restituirà sempre esattamente una riga. Se ora la riga di origine corrisponde alla clausola WHERE, entrambi i valori dei risultati saranno NULL. Se la clausola WHERE corrisponde a più di una riga, verrà preso il massimo.

Tieni presente che questa query potrebbe restituire un numero di porta e un indirizzo IP che originariamente non erano sulla stessa riga.

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;

Opzione 3:usa ROWNUM

Questa query restituisce al massimo una riga. Se nessuna riga corrisponde alla clausola WHERE, viene generata un'eccezione che deve essere gestita:

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;