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

Oracle:cosa significa "esegui immediatamente"?

È per l'esecuzione di SQL dinamico .

Per DML lo useresti quando esegui istruzioni che non hai a disposizione in fase di compilazione, ad es. se l'elenco delle colonne è basato su una selezione dell'utente.

Nel tuo caso viene utilizzato perché DDL non può essere eseguito come SQL statico da PL/SQL. Solo determinate query, comandi DML e TCL sono validi . Qualsiasi altra cosa deve essere considerata dinamica.

Direi che è raro dover usare DDL da un blocco PL/SQL. TRUNCATE potrebbe essere ragionevole; se trovi qualcosa che crea o rilascia oggetti al volo, potrebbe essere più preoccupante in quanto può suggerire un modello di dati non ottimale.

EXECUTE IMMEDIATE di per sé non si impegna automaticamente; ma se esegui DDL, si comporterà come se lo eseguissi al di fuori di PL/SQL, quindi nel tuo caso verrà eseguito il commit, sì.

Per inciso, non sono sicuro del motivo per cui il tuo codice sta utilizzando una variabile intermedia per contenere l'istruzione; è utile se vuoi mostrare cosa verrà eseguito forse, ma sembra che tu non lo stia facendo. Quello che hai potrebbe essere fatto come:

EXECUTE IMMEDIATE 'TRUNCATE TABLE BD_BIDS_EXT_DET';

cioè senza usare V_SQL_1 affatto.