De betekenis van de fout is vrij duidelijk:als we een functie aanroepen vanuit een SELECT-statement, kan het geen DML-statements uitvoeren, dat wil zeggen INSERT, UPDATE of DELETE, of zelfs DDL-statements komen daarbij.
Nu bevat het codefragment dat u hebt gepost een aanroep naar PIPE ROW, dus u noemt dit duidelijk SELECT * FROM TABLE(). Maar het bevat DELETE- en INSERT-instructies, zo duidelijk dat het niet voldoet aan de zuiverheidsniveaus die vereist zijn voor functies in SELECT-instructies.
U moet die DML-instructies dus verwijderen. Je gebruikt ze om een globale tijdelijke tabel te vullen, maar dit is goed nieuws. Je hebt geen code toegevoegd die daadwerkelijk de GTT gebruikt, dus het is moeilijk om zeker te zijn, maar het gebruik van GTT's is vaak niet nodig. Met meer details kunnen we tijdelijke oplossingen voorstellen.
Heeft dit te maken met deze andere vraag van jou ? Zo ja, heb je mijn advies opgevolgd om dat antwoord dat ik op een vergelijkbare vraag had gegeven ?
Voor de volledigheid is het mogelijk om DML- en DDL-statements op te nemen in een functie die in een SELECT-statement wordt aangeroepen. De oplossing is om het AUTONOMOUS_TRANSACTION-pragma te gebruiken. Dit is zelden een goed idee en zou in dit scenario zeker niet helpen. Omdat de transactie autonoom is, zijn de wijzigingen die ze aanbrengt onzichtbaar voor de aanroepende transactie. Dit betekent in dit geval dat de functie de uitkomst van het verwijderen of invoegen in de GTT niet kan zien.