sql >> Databasteknik >  >> RDS >> Oracle

Är det möjligt att använda sql%rowcount för SELECT?

Ja, du kan använda SQL%ROWCOUNT . Det är giltigt i PL/SQL.

Men i PL/SQL måste resultatet av din fråga hamna någonstans, t.ex. till en PL/SQL-tabell. PL/SQL kommer aldrig att skicka resultatet till utgången (terminal, fönster etc.). Så SELECT * FROM kommer inte att fungera.

Din kod kan se ut så här:

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

Uppdatera :

De uppdaterade frågorna tyder på att du letar efter något annat.

Alternativ 1:Använd undantag

Om det finns 0 rader eller fler än 1 rad, hanteras dessa fall separat (som fel):

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;

Alternativ 2:Använd sammanställningar

Med hjälp av aggregationer kommer frågan alltid att returnera exakt en rad. Om nu källraden matchade WHERE-satsen, kommer båda resultatvärdena att vara NULL. Om WHERE-satsen matchade mer än en rad, kommer det maximala antalet att tas.

Observera att den här frågan kan returnera ett portnummer och en IP-adress som ursprungligen inte fanns på samma rad.

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;

Alternativ 3:Använd ROWNUM

Denna fråga returnerar högst en rad. Om ingen rad matchade WHERE-satsen, skapas ett undantag och måste hanteras:

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;


  1. Infoga valda data i databasen

  2. FÖR UPPDATERING v/s LÅS I DELNINGSLÄGE:Tillåt samtidiga trådar att läsa uppdaterat tillståndsvärde för låst rad

  3. Dapper MySQL returvärde

  4. oracle konvertera DD-MÅN-ÅÅ till DD/MM/ÅÅÅÅ