2009-08-06 13 views
5

1つのExecute Immediateステートメント内で複数のddlステートメントを実行しようとしています。 これはかなり正直なものだと思ったが、間違っているようだ。ORACLE Execute Immediate内のDDLステートメントのバッチ

考えはこれです:

declare v_cnt number; 

begin 

select count(*) into v_cnt from all_tables where table_name='TABLE1' and owner = 'AMS'; 

if v_cnt = 0 then 

execute immediate 'CREATE TABLE TABLE1(VALUE VARCHAR2(50) NOT NULL) ALTER TABLE TABLE1 ADD (MYVAL2 NVARCHAR2(10))'; 

end if; 

end; 

は、しかし、これはエラー

ORA-00911になり:無効な文字 ORA-06512:行で10

の各バッチ内のステートメントは、それらを単独で実行するとうまく動作します。私はこのステートメントを取って実行すると、(2つのステートメントの間に;で)うまく動作します。もし私が削除した場合;間違ったオプションについて別のエラーが表示される

私はテーブルを作成し、このテーブルのテーブルスキーマをすべての変更ステートメントを含めてエクスポートしてから別のシステムに対してバッチを実行できるようにしますインストール/アップデートプロセスの一部。

したがって、これらのDDLステートメントを1回の実行で即時にバッチするにはどうすればよいですか?それとも、私が必要としていることをするための良い方法がありますか?

私はOracle newbのビットですが、私は認めなければなりません。皆さん、ご尽力していただきありがとうございます。

答えて

2

なぜ、1回のEXECUTE IMMEDIATEコールが必要ですか?確かに2つのコールとしてそれを行う?

各DDL文には暗黙的なCOMMITが含まれているので、1回の呼び出しでそれを行うことには結び付きがありません。

また、最初の呼び出しでテーブルを正しく設定するだけではどうですか?あなたは...代わりに2回の呼び出しを必要とする...(NOT NULL、MYVAL2 NVARCHAR2(10)VALUE VARCHAR2(50))

TABLE TABLE1を

をCREATEを行うことができます。

また、DBMS_METADATAを参照してください...テーブルなどのオブジェクト用のDDLを生成できます。

+0

テーブルの作成と変更は1つのファイルとしてエクスポートされますが、現在のところ、1 EXECUTE IMMEDIATEと多数のdbオブジェクトでそれを実行しようとするほどの問題はあります。 – Beta033

+0

その場合は、最初に正しいDDLを生成することをお勧めします。 DBMS_METADATAを見てください。 :-) – cagcowboy

+0

これは私の問題を解決するかもしれないようです。悲しいことに明らかな答えは私の鼻の下にあった。 教訓:空想GUIメニューがあるにもかかわらず、構造を出力するためにTOADを使用しないでください。 – Beta033

4

セミコロンは、OracleのSQL構文の一部ではありません。 SQL * Plusや他のクライアント側ツールは、SQL文の終わりを知らせるためにセミコロンを使用しますが、サーバーはそれを認識しません。

我々はDBにセミコロンを渡す* PlusはSQLを強制することができます。

SQL> set sqlterminator off 
SQL> select * from user_tables; 
    2/
select * from user_tables; 
         * 
ERROR at line 1: 
ORA-00911: invalid character 

私はこの文を取り、それを実行した場合、それは(と、2文の間で)正常に動作しますあなたが使用しているクライアントツールは、DBへの2回の呼び出しに分割します。

したがって、実行即時の中に複数のステートメントを渡すことはできないと思います。

匿名のPL/SQLブロックを含む文字列でexecute immediateを呼び出すことができます。個々の呼び出しは、その内部で即座に実行されますが、それが何であるかはわかりません。;)

+0

私の経験は同じです:複数のステートメントを 'EXECUTE IMMEDIATE'の中で渡すことはできません。 – Baodad

関連する問題