Nie pokazałeś kodu Java, ale ze śladu stosu wygląda na to, że dzwonisz executeSqlScript()
ScriptUtil metoda
, który używał domyślnego separatora instrukcji w postaci średnika.
Nie rozpoznaje bloku PL/SQL jako pojedynczej jednostki i zamiast tego próbuje uruchomić wszystko aż do pierwszego średnika jako samodzielną instrukcję SQL - która jest nieprawidłowa i powoduje wyświetlany błąd.
Możesz użyć wersja executeSqlScript()
który pozwala zastąpić domyślne i użyć /
zamiast tego:
co oznaczałoby, że wszystkie instrukcje SQL w twoim skrypcie będą musiały używać /
separator zamiast średnika:
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)
)
/
...
Jak zauważono w komentarzach, twój oryginalny blok i tak nie był w porządku; i create
nie trzeba tego robić przez PL/SQL, nawet jeśli drop
musi być.
Ale ta metoda ma również ignoreFailedDrops
flaga, która wydaje się robić dokładnie to, czego chcesz (nie mogę jej jednak przetestować, żeby to sprawdzić):
Jeśli używasz tej wersji i przekazujesz true dla tej flagi, nie potrzebujesz otoki PL/SQL wokół kropli; możesz zachować separator średników i powrócić do:
DROP TABLE table_a;
CREATE TABLE table_a
(
id VARCHAR(5) PRIMARY KEY,
name VARCHAR(100)
);
...
Jeśli twój skrypt schematu zawiera jakikolwiek inny PL/SQL - wyzwalacz, pakiety itp. - nadal będziesz musiał przełączyć się na używanie separatora ukośnika (lub dowolnego innego wybranego separatora; ukośnik jest jednak tradycyjny) dla wszystkiego.