sql >> Database >  >> RDS >> Oracle

Is het mogelijk om sql%rowcount te gebruiken voor SELECT?

Ja, u kunt SQL%ROWCOUNT gebruiken . Het is geldig in PL/SQL.

In PL/SQL moet het resultaat van uw zoekopdracht echter ergens heen gaan, b.v. in een PL/SQL-tabel. PL/SQL zal het resultaat nooit naar de output sturen (terminal, venster enz.). Dus SELECT * FROM zal niet werken.

Uw code kan er als volgt uitzien:

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

Bijwerken :

De bijgewerkte vragen suggereren dat u op zoek bent naar iets anders.

Optie 1:Gebruik uitzonderingen

Als er 0 rijen of meer dan 1 rij zijn, worden deze gevallen afzonderlijk behandeld (als fouten):

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;

Optie 2:gebruik aggregaties

Met behulp van aggregaties zal de query altijd precies één rij retourneren. Als de bronrij nu overeenkomt met de WHERE-component, zijn beide resultaatwaarden NULL. Als de WHERE-clausule overeenkomt met meer dan één rij, wordt het maximum genomen.

Houd er rekening mee dat deze zoekopdracht een poortnummer en een IP-adres kan retourneren die oorspronkelijk niet op dezelfde rij stonden.

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;

Optie 3:ROWNUM gebruiken

Deze query retourneert maximaal één rij. Als geen enkele rij overeenkomt met de WHERE-component, wordt er een uitzondering gegenereerd die moet worden afgehandeld:

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. Back-up van een SQLite-database

  2. Waarom werkt setval() niet met relatie ... bestaat niet?

  3. Oracle:manier om een ​​niet-gegroepeerde kolom samen te voegen in gegroepeerde resultaten

  4. Top 10 interessante weetjes &tips over MySQL