Come si crea una tabella temporanea in un database Oracle?


90

Vorrei creare una tabella temporanea in un database Oracle

qualcosa di simile a

Declare table @table (int id)

In SQL server

E poi popolarlo con un'istruzione select

È possibile?

Grazie

Risposte:


130

Sì, Oracle ha tabelle temporanee. Ecco un collegamento a un articolo di AskTom che li descrive ed ecco la documentazione ufficiale di Oracle CREATE TABLE.

Tuttavia, in Oracle, solo i dati in una tabella temporanea sono temporanei. La tabella è un oggetto normale visibile ad altre sessioni. È una cattiva pratica creare e rilasciare frequentemente tabelle temporanee in Oracle.

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

Oracle 18c ha aggiunto tabelle temporanee private, che sono oggetti in memoria a sessione singola. Consulta la documentazione per maggiori dettagli. Le tabelle temporanee private possono essere create e rilasciate dinamicamente.

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

Le tabelle temporanee possono essere utili ma vengono comunemente utilizzate in modo improprio in Oracle. Spesso possono essere evitati combinando più passaggi in una singola istruzione SQL utilizzando le visualizzazioni inline.


40
Nessun voto negativo, ma non consiglierei mai CREATE TABLE AS SELECT per una tabella temporanea globale: uno sviluppatore meno esperto potrebbe avere l'idea sbagliata di dover popolare le GTT in questo modo ogni volta. Certo, questo è un modo conveniente per copiare la definizione da un'altra tabella, ma l'esempio probabilmente confonderà alcune persone.
Jeffrey Kemp

Sono totalmente d'accordo con Jeffrey Kemp qui, questo è solo un modo per creare questa tabella, mi sono imbattuto in questo e ho capito amico, devo mettere questa dichiarazione di selezione nel mio DDL.
Vijay Kumar

3
puoi semplicemente aggiungere "dove 1 = 0";
Palcente

@Palcente che ancora implica che avresti bisogno di un "tavolo reale" con la stessa struttura per crearne uno temporaneo, il che non è il caso (vedi anche questa risposta . A parte questo, questa risposta manca di sottolineare che non c'è solo la tabella temporanea GLOBALE , ma si possono usare anche tabelle temporanee "ordinarie". La differenza rispetto a SQL Server, come sottolineato da Matteo , è un altro punto importante da non perdere (o interrogarsi sugli errori sulla "seconda chiamata" sull'oggetto già esistente;)
Izzy

2
Caso d'uso valido per CREATE TABLE AS SELECT: selezionare da tabelle remote con colonne LOB, poiché non è possibile direttamente SELECTda esse. Sto scrivendo una procedura per copiare i record da un database remoto, e questa era la mia soluzione: portare i record in un GTT, e poi copiarli da quello alla tabella "reale".
rgoliveira

78

Solo un suggerimento .. Le tabelle temporanee in Oracle sono diverse da SQL Server. Lo crei UNA VOLTA e solo UNA VOLTA, non ogni sessione. Le righe che inserisci sono visibili solo alla tua sessione e vengono automaticamente cancellate (cioè, TRUNCATEnon DROP) quando termini la sessione (o alla fine della transazione, a seconda della clausola "ON COMMIT" che utilizzi).


15
Non capisco completamente. Hai detto di crearlo una e solo una volta, e non tutte le sessioni. Tuttavia hai anche detto che la tabella temporanea viene eliminata ad ogni sessione. Non significa che dovrai creare la tabella temporanea ad ogni sessione?
Chaos

31
DELETED, non DROPped.
Tripp Kinetics

10
Non crei una tabella temporanea ogni sessione, ma una volta. La tabella è disponibile in tutto il sistema. La tabella è accessibile da qualsiasi sessione creata, comprese le sessioni parallele. ma quando si inseriscono dati dall'interno di una sessione, tali dati non sono visibili da altre sessioni parallele nel sistema. I dati di una sessione sono proprietà solo di quella sessione. Pertanto i dati sono specifici della sessione, non visibili a livello di sistema. Pertanto, quando chiudi una sessione, i dati di quella sessione vengono eliminati dalla tabella.
SubhasisM

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

10
Notare che le righe verranno sempre eliminate alla fine della sessione; ON COMMIT DELETE ROWSsignifica che verranno scartati prima, se effettui il commit in modo incrementale durante una sessione.

1
zygimantus, sì, puoi eliminare manualmente durante la sessione. Durante la sessione, la tabella temporanea si comporta esattamente come una tabella normale. L'unica differenza tra una tabella temporanea e una tabella reale, dal punto di vista dell'utente, è che tutte le righe vengono eliminate al termine della sessione e nessun'altra sessione può leggere il contenuto della tabella utilizzata dalla sessione. C'è un'istanza della tabella per sessione; due sessioni possono utilizzare la stessa tabella temporanea contemporaneamente e avere due diversi set di righe, senza alcun conflitto.
Hans Deragon

-2

CREATE TABLE table_temp_list_objects AS

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


Si prega di formattare la risposta. Sarebbe bello se scrivessi qualcosa sul tuo codice.
Ostello
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.