Du har ikke vist din Java-kode, men ud fra stak-sporingen ser det ud til, at du kalder ScriptUtils executeSqlScript()
metode
, som brugte standard semikolon-sætningsseparator.
Den genkender ikke PL/SQL-blokken som en enkelt enhed, og forsøger i stedet at køre alt op til det første semikolon som en selvstændig SQL-sætning - hvilket ikke er gyldigt og forårsager den fejl, du ser.
Du kan bruge den version af executeSqlScript()
der lader dig tilsidesætte standarden og bruge /
i stedet:
hvilket ville betyde, at alle SQL-sætninger i dit script skal bruge en /
separator i stedet for et semikolon også:
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 bemærket i kommentarerne var din oprindelige blokering alligevel ikke helt korrekt; og create
behøver ikke at ske gennem PL/SQL, selvom drop
skal være.
Men den metode har også en ignoreFailedDrops
flag, som ser ud til at gøre præcis, hvad du vil (jeg kan dog ikke teste det for at tjekke):
Hvis du bruger den version og passerer true for det flag, behøver du ikke PL/SQL-indpakningen omkring dråben; du kan beholde semikolon-separatoren og vende tilbage til:
DROP TABLE table_a;
CREATE TABLE table_a
(
id VARCHAR(5) PRIMARY KEY,
name VARCHAR(100)
);
...
Hvis dit skemascript indeholder en anden PL/SQL - trigger, pakker osv. - så skal du stadig skifte til at bruge skråstreg-separatoren (eller en hvilken som helst anden separator efter eget valg; en skråstreg er dog traditionel) til alt.