Det är för att köra inbyggd dynamisk SQL .
För DML skulle du använda det när du kör satser som du inte har tillgängliga vid kompilering, t.ex. om kolumnlistan är baserad på ett urval från användaren.
I ditt fall används den eftersom DDL inte kan köras som statisk SQL från PL/SQL. Endast vissa fråge-, DML- och TCL-kommandon är giltiga . Allt annat måste behandlas som dynamiskt.
Jag skulle säga att det är ovanligt att behöva använda DDL från ett PL/SQL-block. TRUNCATE
kan vara rimligt; om du hittar något som skapar eller tappar objekt i farten kan det vara mer bekymmersamt eftersom det kan föreslå en suboptimal datamodell.
EXECUTE IMMEDIATE
själv begår inte automatiskt; men om du kör DDL kommer det att fungera på samma sätt som om du körde det utanför PL/SQL, så det kommer att commit i ditt fall, ja.
Jag är för övrigt inte säker på varför din kod använder en mellanvariabel för att hålla påståendet; det är användbart om du vill visa vad det kommer att köra kanske, men du verkar inte göra det. Det du har kan göras som:
EXECUTE IMMEDIATE 'TRUNCATE TABLE BD_BIDS_EXT_DET';
d.v.s. utan att använda V_SQL_1
överhuvudtaget.