web-dev-qa-db-ja.com

SQLブロックのテーブルを変更しようとするとエラーが発生する

Test.sqlファイルを作成し、中に次のコードを追加しました。

begin
alter table table1 enable row movement;
alter table table1 shrink space;
end;
/

これは許可されていませんか?エラーが発生するため:

Encountered the symbol "ALTER" when expecting one of the following:

   begin case declare exit for goto if loop mod null pragma
   raise return select update while with <an identifier>
   <a double-quoted delimited-identifier> <a bind variable> <<
   close current delete fetch lock insert open rollback
   savepoint set sql execute commit forall merge pipe
26
Victor

PL/SQLブロックで静的SQLとしてDDLを発行することはできません。これらのコマンドをPL/SQLブロックに配置する場合は、動的SQLを使用する必要があります。

BEGIN
  EXECUTE IMMEDIATE 'alter table table1 enable row movement';
  EXECUTE IMMEDIATE 'alter table table1 shrink space cascade';
END;
/

ただし、単一のPL/SQLブロックを発行するよりも、連続するSQL文を発行する方が簡単な場合があります。

45
Justin Cave