Sie haben Ihren Java-Code nicht angezeigt, aber aus dem Stack-Trace sieht es so aus, als würden Sie executeSqlScript()
von ScriptUtil Methode
, die das standardmäßige Semikolon-Anweisungstrennzeichen verwendet.
Es erkennt den PL/SQL-Block nicht als einzelne Einheit und versucht stattdessen, alles bis zum ersten Semikolon als eigenständige SQL-Anweisung auszuführen – was nicht gültig ist und den angezeigten Fehler verursacht.
Sie können the Version von executeSqlScript()
Damit können Sie die Standardeinstellung überschreiben und /
verwenden stattdessen:
was bedeuten würde, dass alle SQL-Anweisungen in Ihrem Skript einen /
verwenden müssten Trennzeichen statt Semikolon auch:
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)
)
/
...
Wie in den Kommentaren erwähnt, war Ihr ursprünglicher Block sowieso nicht ganz richtig; und das create
muss nicht über PL/SQL erfolgen, auch wenn der drop
sein muss.
Aber diese Methode hat auch ein ignoreFailedDrops
Flag, das genau das zu tun scheint, was Sie wollen (ich kann es jedoch nicht testen, um es zu überprüfen):
Wenn Sie diese Version verwenden und für dieses Flag true übergeben, brauchen Sie den PL/SQL-Wrapper nicht um den Drop herum; Sie können das Semikolon-Trennzeichen beibehalten und zu:
zurückkehrenDROP TABLE table_a;
CREATE TABLE table_a
(
id VARCHAR(5) PRIMARY KEY,
name VARCHAR(100)
);
...
Wenn Ihr Schemaskript andere PL/SQL-Trigger, Pakete usw. enthält, müssen Sie dennoch für alles auf die Verwendung des Schrägstrich-Trennzeichens (oder eines anderen Trennzeichens Ihrer Wahl; ein Schrägstrich ist jedoch traditionell) umstellen.