Znaczenie błędu jest dość jasne:jeśli wywołamy funkcję z instrukcji SELECT, nie może ona wykonać instrukcji DML, czyli INSERT, UPDATE lub DELETE, lub rzeczywiście dochodzi do tego instrukcje DDL.
Fragment kodu, który wysłałeś, zawiera wywołanie PIPE ROW, więc po prostu wywołujesz to jako SELECT * FROM TABLE(). Ale zawiera instrukcje DELETE i INSERT, więc wyraźnie nie spełnia poziomów czystości wymaganych dla funkcji w instrukcjach SELECT.
Musisz więc usunąć te instrukcje DML. Używasz ich do zapełniania globalnej tabeli tymczasowej, ale to dobra wiadomość. Nie dołączyłeś żadnego kodu, który faktycznie używa GTT, więc trudno mieć pewność, ale używanie GTT jest często niepotrzebne. Mając więcej szczegółów, możemy zaproponować obejścia.
Czy ma to związek z to inne twoje pytanie ? Jeśli tak, czy zastosowałeś się do mojej rady, aby sprawdzić odpowiedź, której udzieliłem na podobne pytanie ?
W trosce o kompletność możliwe jest uwzględnienie instrukcji DML i DDL w funkcji wywoływanej w instrukcji SELECT. Obejściem tego problemu jest użycie pragma AUTONOMOUS_TRANSACTION. Rzadko jest to dobry pomysł i na pewno nie pomogłoby w tym scenariuszu. Ponieważ transakcja jest autonomiczna, wprowadzane przez nią zmiany są niewidoczne dla transakcji wywołującej. Oznacza to w tym przypadku, że funkcja nie widzi wyniku usunięcia lub wstawienia w GTT.