ネイティブの
DMLの場合、コンパイル時に使用できないステートメントを実行するときに使用します。列リストがユーザーからの選択に基づいている場合。
あなたの場合、DDLはPL/SQL内から静的SQLとして実行できないために使用されています。 特定のクエリ、DML、およびTCLコマンドのみが有効です 。それ以外は動的として扱う必要があります。
PL/SQLブロックからDDLを使用する必要があることはめったにないと思います。 TRUNCATE
合理的かもしれません。その場でオブジェクトを作成または削除するものを見つけた場合は、最適ではないデータモデルを示唆する可能性があるため、それはより懸念される可能性があります。
EXECUTE IMMEDIATE
それ自体は自動的にコミットしません。ただし、DDLを実行すると、PL / SQLの外部で実行した場合と同じように動作するため、場合によってはコミットされます。
ちなみに、コードがステートメントを保持するために中間変数を使用している理由はわかりません。これは、実行される内容を表示したい場合に便利ですが、そうではないようです。あなたがしたことは次のように行うことができます:
EXECUTE IMMEDIATE 'TRUNCATE TABLE BD_BIDS_EXT_DET';
つまり、V_SQL_1
を使用しません まったく。