Význam chyby je zcela jasný:voláme-li funkci z příkazu SELECT, nemůže provádět příkazy DML, tedy INSERT, UPDATE nebo DELETE, nebo k tomu skutečně dochází příkazy DDL.
Úryvek kódu, který jste odeslali, nyní obsahuje volání PIPE ROW, takže to zjevně voláte jako SELECT * FROM TABLE(). Zahrnuje však příkazy DELETE a INSERT tak jasně, že je v rozporu s úrovněmi čistoty požadovanými pro funkce v příkazech SELECT.
Musíte tedy tyto příkazy DML odstranit. Používáte je k naplnění globální dočasné tabulky, ale to je dobrá zpráva. Nezahrnuli jste žádný kód, který skutečně používá GTT, takže je těžké si být jistý, ale použití GTT je často zbytečné. S dalšími podrobnostmi můžeme navrhnout náhradní řešení.
Souvisí to s tato další vaše otázka ? Pokud ano, řídili jste se mou radou zkontrolovat tuto odpověď jsem dal na podobnou otázku ?
Pro úplnost je možné zahrnout příkazy DML a DDL do funkce volané v příkazu SELECT. Řešením je použití pragma AUTONOMOUS_TRANSACTION. To je málokdy dobrý nápad a v tomto scénáři by to rozhodně nepomohlo. Protože je transakce autonomní, změny, které provede, jsou pro volající transakci neviditelné. V tomto případě to znamená, že funkce nevidí výsledek smazání nebo vložení do GTT.