По същество те правят едно и също нещо, което е да осигурят механизъм за изпълнение на DDL изрази в PL/SQL, който не се поддържа първоначално. Ако паметта не ме лъже, EXEC_DDL_STATEMENT беше наличен във версията на Oracle 7 на пакета DBMS_UTILITY, докато Native Dynamic SQL (EXECUTE IMMEDIATE) беше въведен само в 8.
Има няколко разлики. EXECUTE IMMEDIATE е главно за изпълнение на динамичен SQL (както показва псевдонимът му на NDS). фактът, че можем да го използваме за DDL, е самостоятелен. Докато EXEC_DDL_STATEMENT() - както предполага - може да изпълнява само DDL.
Но версията на DBMS_UTILITY не се запазва само за обратна съвместимост, тя има един чист трик, който не можем да направим с EXECUTE IMMEDIATE - изпълняване на DDL по разпределен начин. Можем да изпълним този оператор от нашата локална база данни, за да създадем таблица в отдалечена база данни (при условие, че нашият потребител има необходимите привилегии там):
SQL> exec [email protected]_db('create table t1 (id number)');
SQL> exec _db('създайте таблица t1 (id номер)');
Не препоръчвам това, просто казвам, че може да се направи.