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

¿Por qué se necesita EJECUTAR INMEDIATO aquí?

Todo el bloque PL/SQL se analiza en tiempo de compilación, pero el texto dentro de una declaración dinámica no se evalúa hasta el tiempo de ejecución. (Son casi lo mismo para un bloque anónimo, pero siguen siendo pasos distintos).

Su if/else tampoco se evalúa hasta el tiempo de ejecución. El compilador no sabe que la tabla siempre existirá cuando realice la inserción, solo puede verificar si existe o no en el punto en que analiza todo el bloque.

Si la tabla ya existe, está bien; el compilador puede verlo, el bloque se ejecuta, su selección obtiene 1 y usted ingresa en el otro para hacer la inserción. Pero si no existe, el análisis de la inserción falla correctamente con ORA-00942 en tiempo de compilación y no se ejecuta nada en el bloque.

Dado que la creación de la tabla es dinámica, todas las referencias a la tabla también deben ser dinámicas:su inserción como ha visto, pero también si luego la consulta. Básicamente, hace que su código sea mucho más difícil de leer y puede ocultar errores de sintaxis, ya que el código dinámico no se analiza hasta el tiempo de ejecución, y es posible que pueda tener un error en una declaración dinámica en una rama que no es golpeada por un mucho tiempo.

De todos modos, las tablas temporales globales no deben crearse sobre la marcha. Son objetos permanentes con datos temporales, específicos de cada sesión, y no deben crearse/eliminarse como parte del código de su aplicación. (En general, su aplicación no debe realizar cambios de esquema; deben limitarse a cambios de actualización/mantenimiento y controlarse para evitar errores, pérdida de datos y efectos secundarios inesperados; los GTT no son diferentes).

A diferencia de las tablas temporales en otras bases de datos relacionales, cuando crea una tabla temporal en una base de datos Oracle, crea una definición de tabla estática. La tabla temporal es un objeto persistente descrito en el diccionario de datos, pero aparece vacío hasta que su sesión inserta datos en la tabla. Crea una tabla temporal para la base de datos en sí, no para cada procedimiento almacenado PL/SQL.

Cree el GTT una vez y haga que todo su código PL/SQL sea estático. Si desea algo más cercano a las tablas temporales locales de SQL Server, consulte las colecciones de PL/SQL.