sql >> Base de Datos >  >> RDS >> Oracle

ORA-14551:no se puede realizar una operación DML dentro de una consulta

El significado del error es bastante claro:si llamamos a una función desde una declaración SELECT, no puede ejecutar declaraciones DML, es decir, INSERTAR, ACTUALIZAR o ELIMINAR, o incluso las declaraciones DDL vienen a eso.

Ahora, el fragmento de código que ha publicado contiene una llamada a PIPE ROW, por lo que claramente está llamando a esto como SELECT * FROM TABLE(). Pero incluye sentencias DELETE e INSERT tan claramente que no cumple con los niveles de pureza requeridos para las funciones en las sentencias SELECT.

Por lo tanto, debe eliminar esas declaraciones DML. Los está utilizando para completar una tabla temporal global, pero esta es una buena noticia. No ha incluido ningún código que realmente use el GTT, por lo que es difícil estar seguro, pero el uso de GTT a menudo es innecesario. Con más detalles, podemos sugerir soluciones alternativas.

¿Está esto relacionado con esta otra pregunta tuya ? Si es así, ¿siguió mi consejo para verificar esa respuesta que había dado a una pregunta similar ?

En aras de la exhaustividad, es posible incluir sentencias DML y DDL en una función llamada en una sentencia SELECT. La solución es utilizar el pragma AUTONOMOUS_TRANSACTION. Esto rara vez es una buena idea, y ciertamente no ayudaría en este escenario. Debido a que la transacción es autónoma, los cambios que realiza son invisibles para la transacción que llama. Lo que significa en este caso que la función no puede ver el resultado de la eliminación o inserción en el GTT.