La signification de l'erreur est assez claire :si nous appelons une fonction à partir d'une instruction SELECT, elle ne peut pas exécuter les instructions DML, c'est-à-dire INSERT, UPDATE ou DELETE, ou bien les instructions DDL en viennent à cela.
Maintenant, l'extrait de code que vous avez publié contient un appel à PIPE ROW, vous l'appelez donc clairement SELECT * FROM TABLE(). Mais il inclut les instructions DELETE et INSERT si clairement qu'il ne respecte pas les niveaux de pureté requis pour les fonctions dans les instructions SELECT.
Vous devez donc supprimer ces instructions DML. Vous les utilisez pour remplir une table temporaire globale, mais c'est une bonne nouvelle. Vous n'avez inclus aucun code qui utilise réellement le GTT, il est donc difficile d'en être sûr, mais l'utilisation de GTT est souvent inutile. Avec plus de détails, nous pouvons suggérer des solutions de contournement.
Est-ce lié à cette autre question à vous ? Si oui, avez-vous suivi mes conseils pour vérifier cette réponse que j'avais donnée à une question similaire ?
Par souci d'exhaustivité, il est possible d'inclure des instructions DML et DDL dans une fonction appelée dans une instruction SELECT. La solution consiste à utiliser le pragma AUTONOMOUS_TRANSACTION. C'est rarement une bonne idée et cela n'aiderait certainement pas dans ce scénario. Comme la transaction est autonome, les modifications qu'elle apporte sont invisibles pour la transaction appelante. Cela signifie dans ce cas que la fonction ne peut pas voir le résultat de la suppression ou de l'insertion dans le GTT.