Значението на грешката е съвсем ясно:ако извикаме функция от оператор SELECT, тя не може да изпълни DML оператори, това е INSERT, UPDATE или DELETE, или наистина DDL оператори стигат до това.
Сега кодовият фрагмент, който сте публикували, съдържа извикване на PIPE ROW, така че очевидно вие го извиквате като SELECT * FROM TABLE(). Но той включва оператори DELETE и INSERT, така че очевидно е в нарушение на нивата на чистота, изисквани за функциите в операторите SELECT.
Така че трябва да премахнете тези DML изрази. Вие ги използвате за попълване на глобална временна таблица, но това е добра новина. Не сте включили никакъв код, който действително използва GTT, така че е трудно да сте сигурни, но използването на GTT често не е необходимо. С повече подробности можем да предложим заобиколни решения.
Това свързано ли е с този друг ваш въпрос ? Ако е така, последвахте ли съвета ми да проверите този отговор, който бях дал на подобен въпрос ?
За пълнота е възможно да се включат DML и DDL оператори във функция, извикана в оператор SELECT. Заобиколното решение е да използвате прагмата AUTONOMOUS_TRANSACTION. Това рядко е добра идея и със сигурност не би помогнало в този сценарий. Тъй като транзакцията е автономна, промените, които прави, са невидими за извикващата транзакция. В този случай това означава, че функцията не може да види резултата от изтриването или вмъкването в GTT.