Esta crónica ha sido aprobado por especialistas para garantizar la exactitud de este tutorial.
Solución:
¿Cuál es el ciclo de vida de una sesión de Oracle SQL?
Una sesión es un lógico entidad que existe desde el momento en que el código de su aplicación se conecta a la base de datos hasta el momento en que se desconecta.
Las sesiones son independientes de las entidades físicas (basadas en recursos) que las respaldan, como conexiones, procesos de servidor, conexiones de red, etc.
En las configuraciones más simples (y más comunes, imo) (es decir, “servidor dedicado”), existen relaciones 1-1 entre las sesiones lógicas y las conexiones físicas y los procesos del servidor. En configuraciones más avanzadas para admitir una gran cantidad de usuarios, los recursos físicos (conexiones, procesos, recursos de red) pueden compartirse o multiplexarse entre varias sesiones.
Ejecuté lo anterior en mi aplicación y, como era de esperar, el comando c2 arrojó cero resultados. Considero que esto significa que cada consulta constituye su propia sesión.
A menos que el código de su aplicación se esté desconectando o cerrando/liberando su conexión entre llamadas, esto es casi seguro no el caso.
Las tablas temporales globales se pueden crear con dos opciones: ON COMMIT DELETE ROWS
y ON COMMIT PRESERVE ROWS
.
El primero hará que todos los datos de GTT se eliminen en un commit
o rollback
. El segundo hará que todos los datos de GTT persistan durante toda la sesión.
Si NO está usando ON COMMIT DELETE ROWS
, entonces deberías no suponga que el GTT está vacío al comienzo de una llamada dada. Si requiere que el GTT esté vacío al inicio de un procedimiento, debe DELETE FROM
su GTT (o TRUNCATE
it) al comienzo del procedimiento (o al final).
Tenga en cuenta que incluso con esta restricción (es decir, tener que encargarse de vaciar el GTT usted mismo dentro de una sesión), las tablas temporales globales siguen siendo útiles porque aún protegen una sesión para que no vea los datos de otra sesión. También escriben menos rehacer que las tablas normales, especialmente en la versión 12.1 y posteriores. De hecho, a partir de Oracle 12.1, no necesitan escribir ningún rehacer, lo que los hace útiles en bases de datos de solo lectura y en espera.
Aparte…
Ejecuté lo anterior en mi aplicación y, como era de esperar, el comando c2 no arrojó resultados.
Para que esto tenga sentido, su GTT debe haber sido creado con ON COMMIT DELETE ROWS
y el código de su aplicación tiene algún tipo de función de “autoconfirmación” habilitada donde se confirma automáticamente después de cada Command.Execute()
. O de lo contrario, está malinterpretando/informando mal los resultados de su prueba.
No sé si su aplicación mantiene una sesión de Oracle entre llamadas o no, pero de cualquier manera debe tener cuidado de no asumir que la tabla temporal global (GTT) estará vacía en la segunda llamada. Porque si obtiene una sesión “nueva” cada vez, lo que probablemente signifique realmente es que está seleccionando una sesión gratuita de un grupo de conexiones. Y es posible que el usuario anterior de esa sesión (que puede ser usted) ya haya completado el GTT para esa sesión. Descubrí que este es el caso cuando uso Oracle Application Express (APEX), que es un marco de aplicación basado en HTTP.
Debería llamar a un procedimiento almacenado de Oracle que usó el GTT y luego lo truncó (vació) (y/o lo truncó antes de usarlo) para asegurarse de obtener una pizarra limpia cada vez.
Aquí puedes ver las reseñas y valoraciones de los lectores
Nos puedes añadir valor a nuestra información aportando tu experiencia en las reseñas.