Oracle
 sql >> Database >  >> RDS >> Oracle

Forza Oracle Drop Global Temp Table

Le tabelle temporanee globali Oracle non sono oggetti temporanei. Sono veri e propri heap table. Li creiamo una volta e qualsiasi sessione può usarli per archiviare dati visibili solo a quella sessione .

L'aspetto temporaneo è che i dati non sono persistenti oltre una transazione o una sessione. Il dettaglio chiave dell'implementazione è che i dati vengono scritti in un tablespace temporaneo non permanente. Tuttavia, i dati vengono ancora scritti e letti dal disco, quindi c'è un notevole sovraccarico nell'uso delle tabelle temporanee globali.

Il punto è che non dovremmo eliminare e ricreare tabelle temporanee. Se stai cercando di trasferire la logica di stile di SQL Server in Oracle, dovresti considerare l'utilizzo di raccolte PL/SQL per mantenere i dati temporanei in memoria. Scopri di più.

La causa specifica di ORA-14452 è che non possiamo eliminare una tabella temporanea globale che ha la persistenza dell'ambito della sessione se ha contenuto dati durante la sessione. Anche se la tabella è attualmente vuota...

SQL> create global temporary table gtt23 (col1 number)
  2  on commit preserve rows
  3  /

Table created.

SQL> insert into gtt23 values (1);

1 row created.

SQL> commit;

Commit complete.

SQL> delete from gtt23;

1 row deleted.

SQL> commit;

Commit complete.

SQL> drop table gtt23;
drop table gtt23
           *
ERROR at line 1:
ORA-14452: attempt to create, alter or drop an index on temporary table already in use

SQL>

La soluzione è terminare la sessione e riconnettersi, oppure (in modo alquanto strano) troncare la tabella e poi rilasciarla.

SQL> truncate table gtt23;

Table truncated.

SQL> drop table gtt23;

Table dropped.

SQL> 

Se qualche altra sessione sta usando la tabella temporanea globale - e questo è possibile (da cui il globale nomenclatura) quindi non sarai in grado di eliminare la tabella fino a quando tutte le sessioni non si disconnetteranno.

Quindi la vera soluzione è imparare a utilizzare correttamente le tabelle temporanee globali:creare tabelle temporanee globali specifiche che corrispondano a ciascun report. Oppure, come ho detto, usa invece le raccolte PL/SQL. O, anche, semplicemente impara a scrivere un SQL ben sintonizzato. Spesso utilizziamo tabelle temporanee come soluzione alternativa a una query scritta male che potrebbe essere salvata con un percorso di accesso migliore.

Dopo aver esaminato il tuo codice completo, il flusso sembra ancora più bizzarro:

  1. Elimina e ricrea una tabella temporanea globale
  2. Popolare la tabella temporanea
  3. Seleziona dalla tabella temporanea nell'array PL/SQL
  4. Inserisci nella tabella effettiva utilizzando l'inserimento in blocco dall'array PL/SQL

C'è così tanto sovraccarico e attività sprecata qui dentro. Tutto quello che devi fare è prendere i dati che inserisci in v2d_temp e popolare direttamente vertical_design , idealmente con un'istruzione INSERT INTO ... SELECT * FROM. Avrai bisogno di un po' di pre-elaborazione per convertire un array JSON in una query, ma è facile da ottenere in Java o PL/SQL.

Mi sembra certo che le tabelle temporanee globali non siano la soluzione giusta per il tuo scenario.

"il nostro capo o altre persone si ostinano a fare qualcosa a modo loro, quindi non puoi cambiarlo"

Quello che hai è un problema con il capo non è un problema di programmazione . Di conseguenza è fuori tema per quanto riguarda StackOverflow. Ma ecco comunque alcuni suggerimenti.

La cosa fondamentale da ricordare è che non stiamo parlando di un compromesso su alcune architetture non ottimali:ciò che il tuo capo propone chiaramente non funzionerà in un ambiente multiutente. quindi, le tue opzioni sono:

  1. Ignora il ORA-14452 errore, procedi nella produzione e quindi usa la difesa "ma me l'hai detto" quando tutto va terribilmente storto. Questo è il gioco più debole.
  2. Elimina di nascosto le tabelle globali e implementa qualcosa che funzionerà in uno scenario multiutente. Questo è ad alto rischio perché non hai difesa se sbagli l'implementazione.
  3. Parla con il tuo capo. Dì loro che ti stai imbattendo in ORA-14452 errore, supponiamo che tu abbia svolto alcune indagini e sembra un problema fondamentale con l'utilizzo di tabelle temporanee globali in questo modo, ma ovviamente hai trascurato qualcosa. Quindi, chiedi loro come hanno risolto questo problema quando l'hanno implementato in precedenza. Questo può andare in diversi modi, forse hanno una soluzione alternativa, forse si renderanno conto che questo è il modo sbagliato di usare le tabelle temporanee globali, forse ti diranno di perderti. In ogni caso, questo è l'approccio migliore:hai sollevato le preoccupazioni al livello appropriato.

Buona fortuna.