Fondamentalmente fanno la stessa cosa, che è fornire un meccanismo per eseguire istruzioni DDL in PL/SQL, che non è supportato in modo nativo. Se la memoria mi serve bene, EXEC_DDL_STATEMENT era disponibile nella versione Oracle 7 del pacchetto DBMS_UTILITY, mentre Native Dynamic SQL (EXECUTE IMMEDIATE) è stato introdotto solo in 8.
Ci sono un paio di differenze. EXECUTE IMMEDIATE riguarda principalmente l'esecuzione di SQL dinamico (come indica il suo alias NDS). il fatto che possiamo usarlo per DDL è ovvio. Considerando che EXEC_DDL_STATEMENT() - come suggerisce - può eseguire solo DDL.
Ma la versione DBMS_UTILITY non viene mantenuta solo per la compatibilità con le versioni precedenti, ha un trucco che non possiamo fare con ESEGUIRE IMMEDIATO:eseguire DDL in modo distribuito. Possiamo eseguire questa istruzione dal nostro database locale per creare una tabella su un database remoto (a condizione che il nostro utente abbia i privilegi necessari lì):
SQL> exec [email protected]_db('create table t1 (id number)');
Non lo sto raccomandando, sto solo dicendo che si può fare.