¿Que son las tablas temporales privadas?
Además de las tablas de la base de datos permanentes, Oracle permite la creación de tablas temporales para mantener datos propios y exclusivos a una sesión Oracle determinada. Estos datos permanecerán en el sistema sólo durante el tiempo que dure la transacción o sesión involucrada. No obstante, al igual que para las tablas permanentes, la definición de las tablas temporales se almacena en las tablas del sistema.
La sentencia CREATE GLOBAL TEMPORARY TABLE crea una tabla temporal Oracle cuya temporalidad puede ser definida a nivel de transacción (los datos existen mientras se realiza la transacción) o a nivel de sesión (los datos existen mientras dura la sesión). Los datos en una tabla temporal son propios y privativos de la sesión Oracle que la está utilizando. Una sesión Oracle determinada puede ver y modificar los datos que durante dicha sesión se insertaron en la tabla temporal, pero estos datos no son accesibles desde otra sesión diferente. Como es lógico, la sentencia LOCK no tiene efecto sobre las tablas temporales ya que cada sesión hace uso de sus propios datos.
Así pues, los datos almacenados en una tabla temporal son visibles sólo para la sesión de Oracle que inserta datos dentro de dicha tabla. Para especificar si los datos de una tabla temporal son por sesión o por transacción, a la hora de crear la definición de la tabla, utilizaremos la cláusula ON COMMIT DELETE ROWS para indicar que la temporalidad es a nivel de transacción, o la cláusula ON COMMIT PRESERVE ROWS si queremos que la temporalidad sea a nivel de sesión.
A continuación podéis ver un ejemplo de comando SQL para crear una tabla temporal en Oracle:
Ejemplo de como se crea una tabla temporal privada.
CREATE PRIVATE TEMPORARY TABLE ORA$PTT_sales_ptt_transaction
(time_id DATE,
amount_sold NUMBER(10,2))
[ON COMMIT [DELETE | PRESERVE] ROWS]
ON COMMIT [DROP|PRESERVE] DEFINITION;
CREATE GLOBAL TEMPORARY TABLE tab_temp
(
nombre VARCHAR2(40),
fecha_nacimiento DATE
)
ON COMMIT PRESERVE ROWS
Restricciones de las Tablas Temporales Privadas
De por si, las tablas temporales poseen un conjunto de restricciones que detallamos a continuación.
- Las tablas temporales no puede ser particionadas, ni de tipo Cluster o Index Organized.
- No se pueden definir claves foráneas sobre las tablas temporales.
- Las tablas temporales no pueden contener columnas de tipo tabla anidada.
- No se puede realizar UPDATE, DELETE ni MERGE en paralelo en las tablas temporales.
- La única parte de la clausula de atributos de segmento que se puede especificar para las tablas temporales es la option TABLESPACE, la cual debe referenciar a un único tablespace de tipo temporal.
- Las tablas temporales no pueden ser utilizadas en transacciones distribuidas.
- Las tablas temporales no pueden contener columnas de tipo INVISIBLE.
Cuando trabajamos con tablas temporales privadas debemos tener en cuenta las siguientes restricciones adicionales:
- No se puede crear índices, vistas materializadas con tablas temporales privadas.
- No se puede asignar un valor por defecto a las columnas de una tabla temporal privada.
- No se puede hacer referencia a tablas temporales privadas en objetos permanentes, como ser vistas o triggers.
- Las tablas temporales privadas no son visibles a trabes de database links.
- Al no almacenarse su definición en el diccionario de datos, no es factible ver las mismas en las vistas usuales del diccionario de datos, como ser «USER_TABLES». Para poder conocer las tablas temporales privadas existentes en un momento dado se pueden consultar estas dos nuevas vistas:
¿Cuando usar tablas temporales privadas?
Un ejemplo de cuando utilizar una tabla temporal privada es en una base de datos en modo READ ONLY, ya que la misma no es almacenada en el diccionario de datos.
Asimismo, si ejecutamos una sentencia TRUNCATE sobreLos datos de una tabla temporal Oracle se borran automáticamente en el caso de que la sesión termine, bien porque el usuario desconecte, bien porque la sesión termine de una de manera anormal al producirse algún tipo de fallo.
Las tablas temporales admiten la creación de índices con el comando CREATE INDEX. Dichos índices, como las tablas, son también temporales, y los datos en el índice permanecen en el sistema mientras la tabla temporal existe.
También se pueden crear views y triggers sobre tablas temporales.
Asignación de segmentos
Para las tablas temporales, Oracle no asigna un segmento justo en el momento en que son creadas, cosa que si que hace para las tablas permanentes. Por contra, los segmentos son asignados cuando se realiza el primer INSERT.
Se pueden ejecutar sentencias DDL (ALTER TABLE, DROP TABLE, CREATE INDEX,…) sobre las tablas temporales, pero sólo si no hay ninguna sesión que la esté utilizando en ese momento y que ya haya realizado un INSERT sobre la misma. La tabla temporal queda liberada en el momento en que la sesión termina, o cuando se ejecuta una sentencia COMMIT o ABORT si la temporalidad de la tabla fue definida a nivel de transacción.
De igual forma, los segmentos se liberan al final de la transacción o al final de la sesión según se haya definido la temporalidad de la tabla. una tabla temporal, los datos que se truncarán serán los de la propia sesión desde la que se ejecuta la sentencia. Los datos que hayan podido ser insertados desde otras sesiones que estén utilizando la misma tabla, no se verán afectados por la sentencia TRUNCATE.