I grund och botten gör de samma sak, vilket är att tillhandahålla en mekanism för att exekvera DDL-satser i PL/SQL, som inte stöds inbyggt. Om minnet fungerar bra för mig, var EXEC_DDL_STATEMENT tillgängligt i Oracle 7-versionen av paketet DBMS_UTILITY, medan Native Dynamic SQL (EXECUTE IMMEDIATE) bara introducerades i 8.
Det finns ett par skillnader. EXECUTE IMMEDIATE handlar främst om att köra dynamisk SQL (som dess NDS-alias indikerar). det faktum att vi kan använda det för DDL är by-the-by. Medan EXEC_DDL_STATEMENT() - som antyder - bara kan köra DDL.
Men versionen DBMS_UTILITY behålls inte bara för bakåtkompatibilitet, den har ett snyggt knep som vi inte kan göra med EXECUTE IMMEDIATE - att köra DDL på ett distribuerat sätt. Vi kan köra detta uttalande från vår lokala databas för att skapa en tabell på en fjärrdatabas (förutsatt att vår användare har de nödvändiga privilegierna där):
SQL> exec [email protected]_db('create table t1 (id number)');
Jag rekommenderar inte detta, jag säger bara att det kan göras.