Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Ist es möglich, sql%rowcount für SELECT zu verwenden?

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;