Het is bedoeld voor het uitvoeren van native dynamische SQL .
Voor DML zou je het gebruiken bij het uitvoeren van instructies die je niet beschikbaar hebt tijdens het compileren, b.v. als de kolomlijst is gebaseerd op een selectie van de gebruiker.
In jouw geval wordt het gebruikt omdat DDL niet kan worden uitgevoerd als statische SQL vanuit PL/SQL. Alleen bepaalde query-, DML- en TCL-opdrachten zijn geldig . Al het andere moet als dynamisch worden behandeld.
Ik zou zeggen dat het zeldzaam is om DDL van een PL/SQL-blok te moeten gebruiken. TRUNCATE
zou redelijk kunnen zijn; als je iets vindt dat objecten maakt of laat vallen, is dat misschien meer een zorg, omdat het een suboptimaal gegevensmodel kan suggereren.
EXECUTE IMMEDIATE
verbindt zich niet automatisch; maar als je DDL uitvoert, zal dat zich hetzelfde gedragen alsof je het buiten PL/SQL zou draaien, dus het zal in jouw geval committen, ja.
Overigens weet ik niet zeker waarom uw code een tussenliggende variabele gebruikt om de verklaring vast te houden; dat is handig als je wilt laten zien wat het misschien gaat doen, maar het lijkt erop dat je dat niet doet. Wat je hebt kan worden gedaan als:
EXECUTE IMMEDIATE 'TRUNCATE TABLE BD_BIDS_EXT_DET';
d.w.z. zonder gebruik van V_SQL_1
helemaal niet.