Ja, Sie können SQL%ROWCOUNT
verwenden . Es ist in PL/SQL gültig.
In PL/SQL muss das Ergebnis Ihrer Abfrage jedoch irgendwohin gehen, z. in eine PL/SQL-Tabelle. PL/SQL wird das Ergebnis niemals an die Ausgabe senden (Terminal, Fenster etc.). Also SELECT * FROM
wird nicht funktionieren.
Ihr Code könnte so aussehen:
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;
/
Aktualisieren :
Die aktualisierten Fragen deuten darauf hin, dass Sie nach etwas anderem suchen.
Option 1:Ausnahmen verwenden
Wenn es 0 Zeilen oder mehr als 1 Zeile gibt, werden diese Fälle separat behandelt (als Fehler):
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;
Option 2:Aggregationen verwenden
Bei Verwendung von Aggregationen gibt die Abfrage immer genau eine Zeile zurück. Wenn jetzt die Quellzeile mit der WHERE-Klausel übereinstimmt, sind beide Ergebniswerte NULL. Wenn die WHERE-Klausel mehr als einer Zeile entspricht, wird das Maximum genommen.
Beachten Sie, dass diese Abfrage möglicherweise eine Portnummer und eine IP-Adresse zurückgibt, die sich ursprünglich nicht in derselben Zeile befanden.
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;
Option 3:Verwenden Sie ROWNUM
Diese Abfrage gibt höchstens eine Zeile zurück. Wenn keine Zeile mit der WHERE-Klausel übereinstimmt, wird eine Ausnahme ausgelöst und muss behandelt werden:
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;