Służy do uruchamiania natywnego dynamicznego SQL .
W przypadku DML użyjesz go podczas uruchamiania instrukcji, które nie są dostępne w czasie kompilacji, np. jeśli lista kolumn jest oparta na wyborze dokonanym przez użytkownika.
W twoim przypadku jest używany, ponieważ DDL nie może być uruchamiany jako statyczny SQL z poziomu PL/SQL. Tylko niektóre zapytania, polecenia DML i TCL są prawidłowe . Wszystko inne należy traktować jako dynamiczne.
Powiedziałbym, że rzadko trzeba używać DDL z bloku PL/SQL. TRUNCATE
może być rozsądne; jeśli znajdziesz coś, co tworzy lub upuszcza obiekty w locie, może to być bardziej niepokojące, ponieważ może sugerować nieoptymalny model danych.
EXECUTE IMMEDIATE
sam nie zatwierdza automatycznie; ale jeśli wykonasz DDL, to będzie zachowywać się tak samo, jak gdybyś uruchomił go poza PL/SQL, więc w twoim przypadku zostanie zatwierdzony, tak.
Nawiasem mówiąc, nie jestem pewien, dlaczego twój kod używa zmiennej pośredniej do przechowywania instrukcji; jest to przydatne, jeśli chcesz wyświetlić, co może być uruchomione, ale wydaje się, że tego nie robisz. To, co masz, można zrobić jako:
EXECUTE IMMEDIATE 'TRUNCATE TABLE BD_BIDS_EXT_DET';
czyli bez użycia V_SQL_1
w ogóle.