Det er til at køre indbygget dynamisk SQL .
For DML ville du bruge det, når du kører sætninger, som du ikke har til rådighed på kompileringstidspunktet, f.eks. hvis kolonnelisten er baseret på et valg fra brugeren.
I dit tilfælde bliver det brugt, fordi DDL ikke kan køres som statisk SQL fra PL/SQL. Kun visse forespørgsels-, DML- og TCL-kommandoer er gyldige . Alt andet skal behandles som dynamisk.
Jeg vil sige, at det er sjældent at skulle bruge DDL fra en PL/SQL-blok. TRUNCATE
kan være rimeligt; hvis du finder noget, der skaber eller taber objekter i farten, kan det være mere bekymrende, da det kan foreslå en suboptimal datamodel.
EXECUTE IMMEDIATE
selv forpligter sig ikke automatisk; men hvis du udfører DDL, vil det opføre sig på samme måde, som hvis du kørte det uden for PL/SQL, så det vil commit i dit tilfælde, ja.
Jeg er i øvrigt ikke sikker på, hvorfor din kode bruger en mellemvariabel til at holde sætningen; det er nyttigt, hvis du måske vil vise, hvad det skal køre, men du ser ikke ud til at gøre det. Det, du har, kunne gøres som:
EXECUTE IMMEDIATE 'TRUNCATE TABLE BD_BIDS_EXT_DET';
dvs. uden at bruge V_SQL_1
overhovedet.