Oracle
 sql >> Database >  >> RDS >> Oracle

ORA-14551:impossibile eseguire un'operazione DML all'interno di una query

Il significato dell'errore è abbastanza chiaro:se chiamiamo una funzione da un'istruzione SELECT non può eseguire istruzioni DML, cioè INSERT, UPDATE o DELETE, o addirittura istruzioni DDL.

Ora, lo snippet di codice che hai pubblicato contiene una chiamata a PIPE ROW, quindi chiaramente lo stai chiamando SELECT * FROM TABLE(). Ma include le istruzioni DELETE e INSERT così chiaramente che non rispetta i livelli di purezza richiesti per le funzioni nelle istruzioni SELECT.

Quindi, è necessario rimuovere quelle istruzioni DML. Li stai usando per popolare una tabella temporanea globale, ma questa è una buona notizia. Non hai incluso alcun codice che utilizzi effettivamente GTT, quindi è difficile esserne sicuri, ma l'utilizzo di GTT spesso non è necessario. Con maggiori dettagli possiamo suggerire soluzioni alternative.

È correlato a questa altra tua domanda ? In tal caso, hai seguito il mio consiglio di controllare quella risposta che avevo dato a una domanda simile ?

Per ragioni di completezza, è possibile includere istruzioni DML e DDL in una funzione chiamata in un'istruzione SELECT. La soluzione consiste nell'utilizzare il pragma AUTONOMOUS_TRANSACTION. Questa è raramente una buona idea e certamente non aiuterebbe in questo scenario. Poiché la transazione è autonoma, le modifiche apportate sono invisibili alla transazione chiamante. Significa in questo caso che la funzione non può vedere l'esito della cancellazione o dell'inserimento nel GTT.