Du har inte visat din Java-kod, men från stackspårningen ser det ut som att du anropar ScriptUtils executeSqlScript()
metod
, som använde standardseparatorn för semikolonsats.
Den känner inte igen PL/SQL-blocket som en enda enhet, utan försöker istället köra allt upp till första semikolon som en fristående SQL-sats - vilket inte är giltigt och orsakar felet du ser.
Du kan använda den version av executeSqlScript()
som låter dig åsidosätta standarden och använda /
istället:
vilket skulle innebära att alla SQL-satser i ditt skript måste använda en /
separator istället för semikolon också:
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)
)
/
...
Som noterats i kommentarerna var ditt ursprungliga blockering inte riktigt rätt ändå; och create
behöver inte göras via PL/SQL, även om drop
måste vara.
Men den metoden har också en ignoreFailedDrops
flagga, som verkar göra precis vad du vill (jag kan dock inte testa det för att kontrollera):
Om du använder den versionen och passerar true för den flaggan behöver du inte PL/SQL-omslaget runt droppen; du kan behålla semikolonseparatorn och återgå till:
DROP TABLE table_a;
CREATE TABLE table_a
(
id VARCHAR(5) PRIMARY KEY,
name VARCHAR(100)
);
...
Om ditt schemaskript innehåller någon annan PL/SQL - trigger, paket, etc. - måste du fortfarande byta till att använda snedstreckseparatorn (eller valfri annan avgränsare som du väljer, ett snedstreck är dock traditionellt) för allt.