Не сте показали своя Java код, но от трасирането на стека изглежда, че извиквате executeSqlScript()
на ScriptUtil метод
, който използва стандартния разделител на изрази за точка и запетая.
Той не разпознава PL/SQL блока като единична единица и вместо това се опитва да изпълни всичко до първата точка и запетая като самостоятелен SQL израз - което не е валидно и причинява грешката, която виждате.
Можете да използвате the версия на 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
не е необходимо да се прави чрез PL/SQL, дори ако drop
трябва да бъде.
Но този метод също има ignoreFailedDrops
флаг, който изглежда прави точно това, което искате (все пак не мога да го тествам, за да проверя):
Ако използвате тази версия и подадете true за този флаг, нямате нужда от PL/SQL обвивката около падането; можете да запазите разделителя точка и запетая и да се върнете към:
DROP TABLE table_a;
CREATE TABLE table_a
(
id VARCHAR(5) PRIMARY KEY,
name VARCHAR(100)
);
...
Ако вашият скрипт на схема съдържа друг PL/SQL - тригер, пакети и т.н. - тогава все пак ще трябва да преминете към използване на разделителя на наклонена черта (или друг разделител по ваш избор; наклонената черта обаче е традиционна) за всичко.