¿Cómo se crea una tabla temporal en una base de datos de Oracle?


91

Me gustaría crear una tabla temporal en una base de datos de Oracle.

algo como

Declare table @table (int id)

En servidor SQL

Y luego complételo con una declaración de selección

¿Es posible?

Gracias

Respuestas:


130

Sí, Oracle tiene tablas temporales. Aquí hay un enlace a un artículo de AskTom que los describe y aquí está la documentación oficial de Oracle CREATE TABLE.

Sin embargo, en Oracle, solo los datos de una tabla temporal son temporales. La mesa es un objeto normal visible para otras sesiones. Es una mala práctica crear y eliminar tablas temporales con frecuencia en Oracle.

CREATE GLOBAL TEMPORARY TABLE today_sales(order_id NUMBER)
ON COMMIT PRESERVE ROWS;

Oracle 18c agregó tablas temporales privadas, que son objetos en memoria de sesión única. Consulte la documentación para obtener más detalles. Las tablas temporales privadas se pueden crear y eliminar de forma dinámica.

CREATE PRIVATE TEMPORARY TABLE ora$ptt_today_sales AS
SELECT * FROM orders WHERE order_date = SYSDATE;

Las tablas temporales pueden ser útiles, pero se abusa de ellas comúnmente en Oracle. A menudo, pueden evitarse combinando varios pasos en una sola declaración SQL utilizando vistas en línea.


40
No hay voto negativo, pero nunca recomendaría CREAR TABLA COMO SELECCIONAR para una tabla temporal global; un desarrollador con menos experiencia podría tener la idea equivocada de que tiene que completar GTT de esta manera cada vez. Claro, esta es una forma conveniente de copiar la definición de otra tabla, pero el ejemplo probablemente confundirá a algunas personas.
Jeffrey Kemp

Estoy totalmente de acuerdo con Jeffrey Kemp aquí, esta es solo una forma de crear esta tabla, me encontré con esto y me di cuenta, hombre, tengo que poner esta declaración de selección en mi DDL.
Vijay Kumar

3
simplemente puede agregar "donde 1 = 0";
Palcente

@Palcente eso todavía implica que necesitaría una "tabla real" con la misma estructura para crear una temporal, lo cual no es el caso (vea también esta respuesta . Aparte de eso, esta respuesta no señala que no solo hay la tabla temporal GLOBAL , pero también se pueden usar tablas temporales "ordinarias". La diferencia con SQL Server, como señaló Matthew , es otro punto importante que uno debe asegurarse de no perderse (o preguntarse acerca de los errores en "la segunda llamada" sobre el objeto ya existente;)
Izzy

2
Caso de uso válido para CREATE TABLE AS SELECT: seleccione de tablas remotas con columnas LOB, ya que no puede directamente SELECTdesde ellas. Estoy escribiendo un procedimiento para copiar registros de una base de datos remota, y esta fue mi solución: llevar los registros a un GTT y luego copiarlos a la tabla "real".
rgoliveira

78

Solo un consejo ... Las tablas temporales en Oracle son diferentes a SQL Server. Lo crea UNA VEZ y solo UNA VEZ, no en todas las sesiones. Las filas que inserta en él son visibles solo para su sesión y se eliminan automáticamente (es decir, TRUNCATEno DROP) cuando finaliza su sesión (o finaliza la transacción, según la cláusula "ON COMMIT" que utilice).


15
No lo entiendo del todo. Dijiste que lo creas una y solo una vez, y no en todas las sesiones. Sin embargo, también dijo que la tabla temporal se elimina en cada sesión. ¿No significa eso que necesitará crear la tabla temporal en cada sesión?
Chaos

31
DELETED, no DROPped.
Tripp Kinetics

10
No crea una tabla temporal en cada sesión, sino una vez. La tabla está disponible en todo el sistema. Se puede acceder a la tabla desde cualquier sesión que cree, incluidas las sesiones paralelas. pero cuando inserta datos desde dentro de una sesión, esos datos no son visibles desde otras sesiones paralelas en todo el sistema. Los datos de una sesión son propiedad de esa sesión únicamente. Por lo tanto, los datos son específicos de la sesión, no visibles en el sistema. Por lo tanto, cuando cierra una sesión, los datos de esa sesión se eliminan de la tabla.
SubhasisM

33
CREATE GLOBAL TEMPORARY TABLE Table_name
    (startdate DATE,
     enddate DATE,
     class CHAR(20))
  ON COMMIT DELETE ROWS;

10
Tenga en cuenta que las filas siempre se eliminarán al final de la sesión; ON COMMIT DELETE ROWSsignifica que se descartarán antes, si se compromete gradualmente durante una sesión.

1
zygimantus, sí, puede eliminar manualmente durante la sesión. Durante la sesión, la tabla temporal se comporta exactamente como una tabla normal. La única diferencia entre una tabla temporal y una tabla real, desde la perspectiva de un usuario, es que todas las filas se eliminan una vez que finaliza la sesión y ninguna otra sesión puede leer el contenido de la tabla utilizada por la sesión. Hay una instancia de la tabla por sesión; dos sesiones pueden usar la misma tabla temporal al mismo tiempo y tener dos conjuntos de filas diferentes, sin ningún conflicto.
Hans Deragon

-2

CREAR TABLA table_temp_list_objects AS

SELECT o.owner, o.object_name FROM sys.all_objects o WHERE o.object_type = 'TABLE';


Formatee su respuesta. Sería bueno que escribiera algo sobre su código.
albergue
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.