Un procedimiento no devuelve un valor. Una función devuelve un valor, pero no debería estar haciendo DML en una función (de lo contrario, no puede hacer cosas como referenciar la función en una declaración de SQL, confunde concesiones de permisos ya que normalmente los DBA desean otorgar acceso de acceso de solo lectura a los usuarios). a todas las funciones para que los usuarios hagan cálculos de forma consistente, etc.).
Puede agregar un parámetro OUT al procedimiento para devolver el estado. Si el "éxito" significa que uno o más filas se han actualizado, puede utilizar% ROWCOUNT de SQL para obtener un recuento del número de filas modificadas por la instrucción SQL antes y usarlo para poblar el parámetro de retorno, es decir
CREATE OR REPLACE PROCEDURE test_proc (
p_iKey IN VARCHAR2,
p_retVal OUT INTEGER
)
AS
BEGIN
DELETE FROM myTable
WHERE theKey = p_iKey;
IF(SQL%ROWCOUNT >= 1)
THEN
p_retVal := 1;
ELSE
p_retVal := 0;
END IF;
END test_proc;
Por supuesto, desde el punto de vista de la claridad general del código, tengo dudas sobre los parámetros de OUT que parecen estar intentando devolver un código de estado. En general, es mucho mejor atendido al asumir el éxito y lanzar excepciones en caso de error.
ORA-14551: no se puede realizar una operación DML dentro de una consulta – Benoit
@Benoit que es como debería ser, la función está destinada a invocarse desde PL/SQL no SQL simple – stjohnroe