Domanda

Conosco il server Sybase / SQL, dove posso creare un temp. tabella come questa:

SELECT * 
INTO   #temp
FROM   tab1 , 
       tab2 
WHERE  tab1.key = tab2.fkey

SELECT * 
FROM   #temp 
WHERE  field1 = 'value' 

#temp esiste solo per la durata di questa sessione e può essere visto solo da me.

Vorrei fare una cosa simile in Oracle, ma sto leggendo "tabelle temporanee globali", che non sembrano la stessa cosa.

Come posso fare la stessa cosa in Oracle come sto facendo in Sybase?

Grazie :)

È stato utile?

Soluzione

Il tuo primo approccio dovrebbe essere quello di fare questo come una singola query:

SELECT * 
FROM   
(
SELECT * 
FROM   tab1 , 
       tab2 
WHERE  tab1.key = tab2.fkey
)
WHERE  field1 = 'value';

Per situazioni molto complesse o in cui temp # è molto grande, prova una clausola di factoring di subquery, facoltativamente con il suggerimento materialize:

with #temp as
(
SELECT /*+ materialize */ 
       * 
FROM   tab1 , 
       tab2 
WHERE  tab1.key = tab2.fkey
)
SELECT * 
FROM   temp#
WHERE  field1 = 'value';

Se ciò non è utile, vai al metodo Tabella temporanea globale.

Altri suggerimenti

Una tabella temporanea globale non è la stessa, la definizione rimane dopo la fine della sessione, anche la tabella (ma non i dati) è visibile a tutte le sessioni.

Se stai scrivendo procedure memorizzate, hai esaminato i cursori? È un po 'più complicato, ma un modo molto efficiente e pulito di lavorare con un set di dati temporaneo.

Oracle non fornisce un analogo diretto di questa funzione. Una tabella temporanea globale è simile, ma deve essere creata in anticipo e può essere difficile modificarla a causa di problemi di blocco.

La maggior parte delle esigenze di questa natura può essere soddisfatta con cursori o uno dei diversi tipi di raccolta pl / sql (tabelle nidificate, array, matrici associative), ma nessuna di queste può essere utilizzata come se fosse una tabella. Cioè, non puoi SELEZIONARE da loro.

Credo che le tabelle temporanee globali siano le stesse. Ti daranno accesso privato a una tabella temporanea che termina al termine della sessione:

  

I dati in una tabella temporanea globale sono privati, in modo tale che i dati inseriti da una sessione siano accessibili solo da quella sessione. Le righe specifiche della sessione in una tabella temporanea globale possono essere conservate per l'intera sessione o solo per la transazione corrente. La clausola ON COMMIT DELETE ROWS indica che i dati devono essere eliminati al termine della transazione.

Dopo aver letto la domanda qualche volta in più, credo che sia la differenza principale, e forse il tuo problema è che le tabelle temporanee persistono tra le sessioni. Quindi l'equivalente esatto non è possibile come immagineresti in Oracle sarebbe qualcosa di simile:

CREATE GLOBAL TEMPORARY TABLE my_temp_table ON COMMIT DELETE ROWS select * from other table;

Quella tabella rimarrà attiva fino a quando non verrà rilasciata anche attraverso le sessioni, sebbene i dati in essa contenuti non lo siano. Dovresti invece creare in anticipo la tabella temporanea.

Il modello di tabella temporanea è leggermente diverso in Oracle e ruota attorno alla "CREATE GLOBAL TEMPORARY TABLE .." dichiarazione. Le definizioni delle tabelle temporanee sono sempre globali, ma i dati sono sempre privati ??della sessione e se i dati persistono su un commit dipende dal fatto che la qualifica "sul commit consenta di conservare le righe". oppure " su commit elimina righe " è specificato.

Ho alcuni script Perl e un post sul blog che esplora il comportamento specifico o le tabelle temporanee Oracle su il mio blog .

Sì, Carson ha ragione. Le tabelle temporanee globali sono visibili solo alla sessione che le crea e scompaiono al primo commit o rollback o alla fine della sessione. Puoi impostarlo quando crei gtt.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top