Je hebt je Java-code niet getoond, maar uit de stack-trace lijkt het alsof je ScriptUtil's executeSqlScript()
methode
, die het standaard scheidingsteken voor puntkomma's gebruikte.
Het herkent het PL/SQL-blok niet als een enkele eenheid en probeert in plaats daarvan alles tot aan de eerste puntkomma uit te voeren als een op zichzelf staande SQL-instructie - wat niet geldig is en de fout veroorzaakt die u ziet.
U kunt de versie van executeSqlScript()
waarmee je de standaard kunt overschrijven en /
. kunt gebruiken in plaats daarvan:
wat zou betekenen dat alle SQL-instructies in uw script een /
. zouden moeten gebruiken scheidingsteken ook in plaats van een puntkomma:
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)
)
/
...
Zoals opgemerkt in opmerkingen, was je oorspronkelijke blok toch niet helemaal goed; en de create
hoeft niet via PL/SQL te gebeuren, zelfs als de drop
moet zijn.
Maar die methode heeft ook een ignoreFailedDrops
vlag, die precies lijkt te doen wat je wilt (ik kan het echter niet testen om te controleren):
Als je die versie gebruikt en waar voor die vlag doorgeeft, heb je de PL/SQL-wrapper rond de drop niet nodig; u kunt het scheidingsteken voor puntkomma's behouden en terugkeren naar:
DROP TABLE table_a;
CREATE TABLE table_a
(
id VARCHAR(5) PRIMARY KEY,
name VARCHAR(100)
);
...
Als uw schemascript een andere PL/SQL bevat - trigger, pakketten, enz. - dan moet u nog steeds voor alles overschakelen naar het gebruik van het scheidingsteken voor slash (of een ander scheidingsteken naar keuze; een schuine streep is echter traditioneel).