Estoy experimentando un comportamiento interesante al usar funciones definidas por el usuario dentro de una instrucción SELECT.¿Cuándo se evalúan las funciones definidas por el usuario en una consulta en Oracle?
Tengo un par de procedimientos almacenados que leen y eliminan datos de una sola tabla. Estos procedimientos almacenados son utilizados por múltiples fuentes.
En mis observaciones, parece que las funciones definidas por el usuario a veces se evalúan de manera arbitraria, no siempre inmediatamente después o durante la ejecución de la instrucción SELECT que se utiliza en.
Por ejemplo, en un procedimiento almacenado, tengo una instrucción de selección podría ser algo como esto:
SELECT Something, MyFunction(Something) FROM Somewhere;
esto es seguido por una llamada a otro procedimiento almacenado, que purga datos de la tabla. La cantidad de datos purgados se rige por otra tabla, que almacena la lectura de ID máxima. Esto es para que una purga no elimine ningún dato que aún no haya sido leído por otra instancia de la ejecución del procedimiento almacenado.
En mi código de prueba, MyFunction simplemente devuelve el número de filas en la tabla En algún lugar. Por lo tanto, me imagino que siempre debería ser igual al número de filas que devuelve la instrucción SELECT. Sin embargo, en los casos en que ejecutar dos instancias de este procedimiento almacenado, consigo resultados algo como esto:
Primera instancia de consulta:
Something MyFunction(Something)
--------- ---------------------
A 3
B 3
C 3
Segunda instancia de consulta:
Something MyFunction(Something)
--------- ---------------------
A 0
B 0
C 0
¿Por qué es que la segunda consulta devuelve todas las filas, pero la función definida por el usuario que opera en la misma tabla informa que no hay más filas en la tabla?
¿De todos modos puedo asegurarme de que la segunda instancia de consulta es coherente en que las funciones definidas por el usuario aún ven los mismos datos que el procedimiento almacenado padre está viendo?
No estoy seguro de entender: entre las 2 llamadas hice y ¿purgas la mesa? – Sebas
Disculpa la confusión. Para aclarar, hay un procedimiento almacenado que (1) realiza la instrucción SELECT y (2) llama al procedimiento de purga después de la instrucción SELECT. – acee
Veo, por lo que la función devuelve el resultado correcto ¿no? El seleccionar no lo hace, o dicho de otra manera, no se debe devolver ninguna fila. ¿Confirmado? – Sebas