Oracle
 sql >> Base de données >  >> RDS >> Oracle

Est-il possible d'utiliser sql%rowcount pour SELECT ?

Oui, vous pouvez utiliser SQL%ROWCOUNT . C'est valide en PL/SQL.

Cependant, en PL/SQL, le résultat de votre requête doit aller quelque part, par exemple. dans une table PL/SQL. PL/SQL n'enverra jamais le résultat à la sortie (borne, fenêtre, etc.). Donc SELECT * FROM ne fonctionnera pas.

Votre code pourrait ressembler à ceci :

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

Mettre à jour :

Les questions mises à jour suggèrent que vous cherchez autre chose.

Option 1 :Utiliser des exceptions

S'il y a 0 ligne ou plus d'une ligne, ces cas sont traités séparément (comme des erreurs) :

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 :Utiliser des agrégations

En utilisant des agrégations, la requête renverra toujours exactement une ligne. Si maintenant la ligne source correspond à la clause WHERE, les deux valeurs de résultat seront NULL. Si la clause WHERE correspond à plus d'une ligne, le maximum sera pris.

Notez que cette requête peut renvoyer un numéro de port et une adresse IP qui, à l'origine, n'étaient pas sur la même ligne.

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 :Utiliser ROWNUM

Cette requête renvoie au plus une ligne. Si aucune ligne ne correspond à la clause WHERE, une exception est levée et doit être gérée :

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;