sql >> Base de Datos >  >> RDS >> Oracle

¿Es posible usar sql%rowcount para SELECT?

Sí, puede usar SQL%ROWCOUNT . Es válido en PL/SQL.

Sin embargo, en PL/SQL, el resultado de su consulta debe ir a alguna parte, p. en una tabla PL/SQL. PL/SQL nunca enviará el resultado a la salida (terminal, ventana, etc.). Así que SELECT * FROM no funcionará.

Su código podría tener este aspecto:

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

Actualizar :

Las preguntas actualizadas sugieren que estás buscando algo más.

Opción 1:Usar excepciones

Si hay 0 filas o más de 1 fila, estos casos se manejan por separado (como errores):

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;

Opción 2:Usar agregaciones

Usando agregaciones, la consulta siempre devolverá exactamente una fila. Si ahora la fila de origen coincide con la cláusula WHERE, ambos valores de resultado serán NULL. Si la cláusula WHERE coincidió con más de una fila, se tomará el máximo.

Tenga en cuenta que esta consulta puede devolver un número de puerto y una dirección IP que originalmente no estaban en la misma fila.

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;

Opción 3:Usar ROWNUM

Esta consulta devuelve como máximo una fila. Si ninguna fila coincide con la cláusula WHERE, se lanza una excepción y debe manejarse:

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;