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;