Чтобы удалить данные из таблицы используя вызов функции в селекте, эта функция должна быть скомпилирована с указанием прагмы автономной транзакции. Если вы хотите возвращать таблицу, вы можете использовать предложение returning для получения удаленных записей, например
CREATE PACKAGE PKG_EMP
IS
TYPE emp_rec IS RECORD (id emp.id%TYPE,
name emp.name%TYPE);
TYPE emp_nt IS TABLE OF emp_rec;
FUNCTION delete_emp (in_deptid IN department.id%TYPE) RETURN emp_nt PIPELINED;
END;
/
CREATE PACKAGE BODY PKG_EMP IS
FUNCTION delete_emp (in_deptid IN department.id%TYPE) RETURN emp_nt PIPELINED
IS
PRAGMA AUTONOMOUS_TRANSACTION;
v_return_emp emp_nt;
BEGIN
BEGIN
DELETE FROM EMP
WHERE deptid = in_deptid
RETURNING id, name BULK COLLECT INTO v_return_emp;
COMMIT;
EXCEPTION WHEN OTHERS THEN
ROLLBACK;
END;
FOR indx IN 1 .. v_return_emp.COUNT
LOOP
PIPE ROW (v_return_emp(indx));
END LOOP;
RETURN;
END;
END;
/
SELECT * FROM TABLE (PKG_EMP.DELETE_EMP (10) )