Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

ORA-14551:não é possível executar uma operação DML dentro de uma consulta


O significado do erro é bastante claro:se chamarmos uma função de uma instrução SELECT, ela não poderá executar instruções DML, ou seja, INSERT, UPDATE ou DELETE, ou mesmo instruções DDL chegam a isso.

Agora, o trecho de código que você postou contém uma chamada para PIPE ROW, então claramente você está chamando isso de SELECT * FROM TABLE(). Mas ele inclui instruções DELETE e INSERT tão claramente que infringem os níveis de pureza exigidos para funções em instruções SELECT.

Portanto, você precisa remover essas instruções DML. Você os está usando para preencher uma tabela temporária global, mas isso é uma boa notícia. Você não incluiu nenhum código que realmente usa o GTT, por isso é difícil ter certeza, mas o uso de GTTs geralmente é desnecessário. Com mais detalhes, podemos sugerir soluções alternativas.

Isso está relacionado a esta outra pergunta sua ? Em caso afirmativo, você seguiu meu conselho para verificar essa resposta que dei a uma pergunta semelhante ?

Por uma questão de completude, é possível incluir instruções DML e DDL em uma função chamada em uma instrução SELECT. A solução é usar o pragma AUTONOMOUS_TRANSACTION. Isso raramente é uma boa ideia e certamente não ajudaria nesse cenário. Como a transação é autônoma, as alterações feitas são invisíveis para a transação de chamada. Significando neste caso que a função não pode ver o resultado da exclusão ou inserção no GTT.