Betydningen af fejlen er ganske klar:hvis vi kalder en funktion fra en SELECT-sætning, kan den ikke udføre DML-sætninger, det vil sige INSERT, UPDATE eller DELETE, eller faktisk kommer DDL-sætninger til det.
Nu indeholder det kodestykke, du har postet, et kald til PIPE ROW, så det er klart, at du kalder dette som SELECT * FROM TABLE(). Men det inkluderer DELETE- og INSERT-sætninger, så klart, at det falder i strid med de renhedsniveauer, der kræves for funktioner i SELECT-sætninger.
Så du skal fjerne disse DML-sætninger. Du bruger dem til at udfylde en global midlertidig tabel, men det er gode nyheder. Du har ikke inkluderet nogen kode, som rent faktisk bruger GTT, så det er svært at være sikker, men det er ofte unødvendigt at bruge GTT'er. Med flere detaljer kan vi foreslå løsninger.
Er dette relateret til dette andet spørgsmål fra dig ? Hvis ja, fulgte du mit råd om at tjekke det svar havde jeg givet på et lignende spørgsmål ?
For fuldstændighedens skyld er det muligt at inkludere DML- og DDL-sætninger i en funktion kaldet i en SELECT-sætning. Løsningen er at bruge AUTONOMOUS_TRANSACTION-pragmaen. Dette er sjældent en god idé, og det ville bestemt ikke hjælpe i dette scenarie. Fordi transaktionen er autonom, er de ændringer, den foretager, usynlige for den kaldende transaktion. Det betyder i dette tilfælde, at funktionen ikke kan se resultatet af sletningen eller indsættelsen i GTT.