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

Perché è necessario ESEGUIRE IMMEDIATO qui?

L'intero blocco PL/SQL viene analizzato in fase di compilazione, ma il testo all'interno di un'istruzione dinamica non viene valutato fino al runtime. (Sono vicini alla stessa cosa per un blocco anonimo, ma comunque passaggi distinti).

Anche il tuo if/else non viene valutato fino al runtime. Il compilatore non sa che la tabella esisterà sempre nel momento in cui esegui l'inserimento, può solo verificare se esiste o meno nel momento in cui analizza l'intero blocco.

Se la tabella esiste già, è OK; il compilatore può vederlo, il blocco viene eseguito, la tua selezione ottiene 1 e vai nell'altro per eseguire l'inserimento. Ma se non esiste, l'analisi dell'inserto non riesce correttamente con ORA-00942 in fase di compilazione e non viene eseguito nulla nel blocco.

Poiché la creazione della tabella è dinamica, anche tutti i riferimenti alla tabella devono essere dinamici:il tuo inserto come hai visto, ma anche se lo interroghi. Fondamentalmente rende il tuo codice molto più difficile da leggere e può nascondere gli errori di sintassi, poiché il codice dinamico non viene analizzato fino al runtime ed è possibile che tu possa avere un errore in un'istruzione dinamica in un ramo che non viene colpito per un molto tempo.

Le tabelle temporanee globali non dovrebbero comunque essere create al volo. Sono oggetti permanenti con dati temporanei, specifici per ogni sessione, e non devono essere creati/eliminati come parte del codice dell'applicazione. (Nessuna modifica allo schema dovrebbe essere apportata dall'applicazione in generale; dovrebbero essere limitate alle modifiche di aggiornamento/manutenzione ed essere controllate, per evitare errori, perdita di dati ed effetti collaterali imprevisti; i GTT non sono diversi).

A differenza delle tabelle temporanee in altri database relazionali, quando si crea una tabella temporanea in un database Oracle, si crea una definizione di tabella statica. La tabella temporanea è un oggetto persistente descritto nel dizionario dei dati, ma appare vuota finché la sessione non inserisce i dati nella tabella. Crea una tabella temporanea per il database stesso, non per tutte le procedure memorizzate PL/SQL.

Crea il GTT una volta e rendi statico tutto il tuo codice PL/SQL. Se vuoi qualcosa di più vicino alle tabelle temporanee locali di SQL Server, esamina le raccolte PL/SQL.