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:
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.
CREATE TABLE AS SELECT
: seleccione de tablas remotas con columnas LOB, ya que no puede directamente SELECT
desde 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".
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, TRUNCATE
no DROP
) cuando finaliza su sesión (o finaliza la transacción, según la cláusula "ON COMMIT" que utilice).
DELETED
, no DROP
ped.
CREATE GLOBAL TEMPORARY TABLE Table_name
(startdate DATE,
enddate DATE,
class CHAR(20))
ON COMMIT DELETE ROWS;
ON COMMIT DELETE ROWS
significa que se descartarán antes, si se compromete gradualmente durante una sesión.