Nó dành cho chạy SQL động gốc .
Đối với DML, bạn sẽ sử dụng nó khi chạy các câu lệnh mà bạn không có sẵn tại thời điểm biên dịch, ví dụ:nếu danh sách cột dựa trên lựa chọn từ người dùng.
Trong trường hợp của bạn, nó đang được sử dụng vì DDL không thể chạy dưới dạng SQL tĩnh từ bên trong PL / SQL. Chỉ truy vấn nhất định, lệnh DML và TCL hợp lệ . Mọi thứ khác phải được coi là động.
Tôi muốn nói rằng hiếm khi cần sử dụng DDL từ một khối PL / SQL. TRUNCATE
có thể là hợp lý; nếu bạn tìm thấy bất cứ thứ gì tạo ra hoặc làm rơi các đối tượng khi đang di chuyển thì đó có thể là vấn đề đáng quan tâm hơn vì nó có thể đề xuất một mô hình dữ liệu dưới mức tối ưu.
EXECUTE IMMEDIATE
bản thân nó không tự động cam kết; nhưng nếu bạn thực thi DDL thì điều đó sẽ hoạt động giống như khi bạn chạy nó bên ngoài PL / SQL, vì vậy nó sẽ cam kết trong trường hợp của bạn, vâng.
Ngẫu nhiên, tôi không chắc tại sao mã của bạn đang sử dụng một biến trung gian để giữ câu lệnh; điều đó hữu ích nếu bạn muốn hiển thị những gì nó có thể sẽ chạy, nhưng dường như bạn không làm như vậy. Những gì bạn có thể làm là:
EXECUTE IMMEDIATE 'TRUNCATE TABLE BD_BIDS_EXT_DET';
tức là không sử dụng V_SQL_1
ở tất cả.