Javaコードを表示していませんが、スタックトレースから、ScriptUtilのexecuteSqlScript()
方法
、デフォルトのセミコロンステートメント区切り文字を使用しました。
PL / SQLブロックを単一のユニットとして認識せず、代わりに最初のセミコロンまでのすべてをスタンドアロンSQL文として実行しようとします。これは無効であり、表示されるエラーの原因になります。
>
executeSqlScript()
のバージョン
これにより、デフォルトを上書きして/
を使用できます 代わりに:
つまり、スクリプト内のすべてのSQLステートメントで/
を使用する必要があります。 セミコロンの代わりに区切り文字も:
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE table_a';
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -942 THEN
RAISE;
END IF;
END;
/
CREATE TABLE table_a
(
id VARCHAR(5) PRIMARY KEY,
name VARCHAR(100)
)
/
...
コメントに記載されているように、元のブロックはとにかく正しくありませんでした。およびcreate
drop
であっても、PL/SQLを介して実行する必要はありません。 する必要があります。
ただし、そのメソッドにはignoreFailedDrops
もあります フラグ。これはあなたが望むことを正確に実行しているようです(ただし、テストして確認することはできません):
そのバージョンを使用し、そのフラグにtrueを渡す場合、ドロップの周りにPL/SQLラッパーは必要ありません。セミコロン区切り文字を保持して、次の状態に戻すことができます:
DROP TABLE table_a;
CREATE TABLE table_a
(
id VARCHAR(5) PRIMARY KEY,
name VARCHAR(100)
);
...
スキーマスクリプトに他のPL/SQL(トリガー、パッケージなど)が含まれている場合でも、すべてにスラッシュ区切り文字(または他の任意の区切り文字。スラッシュは従来の方法です)を使用するように切り替える必要があります。