Pregunta

Los documentos de las funciones tuberías dicen que DML no está permitido cuando se usan en una declaración SQL (generalmente un SELECT), y en la mayoría de los ejemplos, las funciones canalizadas se utilizan para la generación o transformación de datos (aceptando un custor como parámetro), pero no emiten ninguna declaración de DML.

Ahora, técnicamente, es posible usar Selects sin ningún error de Oracle (Ora 14551 no ocurrirá). Sin embargo, tengo experiencias de comportamiento extraño reproducible de la selección; a pesar de PRAGMA AUTONOMOUS_TRANSACTION es no siendo utilizado, las filas recuperadas por el SELECT parecer no Siempre tenga en cuenta la transacción local actual, lo que me parece un error. Aún más inquietante es el hecho de que, cuando se usa una transacción distribuida (por ejemplo a través de oramts en lugar de una transacción local), se usa la transacción.

Editar: Como resultado, el efecto extraño parece relacionado con algunos con declaraciones en la consulta, que a veces funcionan y a veces no (dependiendo del estado de ánimo actual del Oracle Optimizer, al menos en 10 g). En algunos casos, obtengo un ORA-32036, luego, nuevamente, no ocurre, sin cambiar el código en absoluto. Ahora parece que las consultas que a veces fallan con el ORA-32036 son las que tampoco usan la transacción correcta, y no pueden estar relacionadas con la función canalizada.

Entonces mis preguntas específicas son:

  • ¿Hay alguna declaración, preferiblemente oficial, si SELECTS en las funciones de la tabla canalizada se permiten y cuál es su contexto transaccional?

  • ¿Existe otra forma de modularizar consultas de uso común que se puede usar en las declaraciones SQL (tal como las funciones de la tabla pueden con TABLE())?

  • ¿Alguien también ha experimentado ese comportamiento y tal vez sabe más al respecto? He buscado en Metalink, pero desafortunadamente no encontré nada específico sobre el tema.

¿Fue útil?

Solución

  1. Por lo general, las restricciones de DML solo se refieren a la modificación (actualización, eliminar ...) Las declaraciones, por lo que seleccionar debe estar bien. Intentaré encontrar una declaración específica de Oracle.

  2. Las vistas serían su primera herramienta para modularizar consultas de uso común.

  3. Las funciones tienen un inconveniente sobre las vistas: si se llaman desde otra selección, no se ejecutan en el mismo punto en el tiempo que la selección principal. Cada llamada a una selección es consistente, pero como la selección está en el código de función y no en el SQL principal, puede devolver resultados inconsistentes. Esto no es posible con las vistas y sub-selección: si una gran declaración de declaración, la vista, la vista se construye en el mismo punto en el tiempo que la consulta principal.

Actualizar: Con respecto a su comentario sobre consultas parametrizadas

Puede crear vistas parametrizadas, es decir, vistas que dependen de las variables establecidas antes de la ejecución. Aquí hay un ejemplo en Asktom mostrando cómo podrías hacerlo con userenv('client_info') o dbms_session.set_context.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top