• Как выполнить функцию, которая возвращает таблицу и при этом удаляет данные из другой таблицы?

    @parikLS
    Чтобы удалить данные из таблицы используя вызов функции в селекте, эта функция должна быть скомпилирована с указанием прагмы автономной транзакции. Если вы хотите возвращать таблицу, вы можете использовать предложение 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) )
    Ответ написан
    Комментировать