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;