Zasadniczo robią to samo, czyli zapewniają mechanizm wykonywania instrukcji DDL w PL/SQL, który nie jest obsługiwany natywnie. Jeśli pamięć mi dobrze służy, EXEC_DDL_STATEMENT był dostępny w wersji Oracle 7 pakietu DBMS_UTILITY, podczas gdy Native Dynamic SQL (EXECUTE IMMEDIATE) został wprowadzony dopiero w 8.
Jest kilka różnic. EXECUTE IMMEDIATE polega głównie na wykonywaniu dynamicznego SQL (jak wskazuje jego alias NDS). fakt, że możemy go używać do DDL, jest na marginesie. Natomiast EXEC_DDL_STATEMENT() - jak sugeruje - może wykonywać tylko DDL.
Ale wersja DBMS_UTILITY nie jest zachowywana tylko dla wstecznej kompatybilności, ma jedną fajną sztuczkę, której nie możemy zrobić z EXECUTE IMMEDIATE - uruchamianie DDL w sposób rozproszony. Możemy uruchomić tę instrukcję z naszej lokalnej bazy danych, aby utworzyć tabelę w zdalnej bazie danych (pod warunkiem, że nasz użytkownik ma tam niezbędne uprawnienia):
SQL> exec [email protected]_db('create table t1 (id number)');
Nie polecam tego, po prostu mówię, że można to zrobić.