6

execute immediateDML および DDL ステートメントで使用される場合の PL/SQL での重要性は何ですか? execute immediateDDL ステートメントのように暗黙的にデータベースにコミットしますか?

以下は私が遭遇した例です:

SELECT 'TRUNCATE TABLE BD_BIDS_APPR_DET' INTO V_SQL1 FROM DUAL;
EXECUTE IMMEDIATE V_SQL1;

SELECT 'TRUNCATE TABLE BD_BIDS_SYS_DET' INTO V_SQL1 FROM DUAL;
EXECUTE IMMEDIATE V_SQL1;

SELECT 'TRUNCATE TABLE BD_BIDS_EXT_DET' INTO V_SQL1 FROM DUAL;
EXECUTE IMMEDIATE V_SQL1;
4

2 に答える 2

10

ネイティブの動的 SQLを実行するためのものです。

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、まったく使用しません。

于 2013-08-22T09:46:32.560 に答える