Neukázali jste svůj kód Java, ale z trasování zásobníku to vypadá, že voláte executeSqlScript()
ScriptUtil metoda
, který používal výchozí oddělovač příkazů středníkem.
Neuznává blok PL/SQL jako jednu jednotku a místo toho se pokouší spustit vše až po první středník jako samostatný příkaz SQL – což není platné a způsobuje chybu, kterou vidíte.
Můžete použít verzi executeSqlScript()
což vám umožní přepsat výchozí a použít /
místo toho:
což by znamenalo, že všechny příkazy SQL ve vašem skriptu by musely používat /
také oddělovač místo středníku:
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 je uvedeno v komentářích, váš původní blok stejně nebyl úplně správný; a create
nemusí být provedeno přes PL/SQL, i když drop
musí být.
Ale tato metoda má také ignoreFailedDrops
flag, který vypadá, že dělá přesně to, co chcete (nemohu to však otestovat):
Pokud použijete tuto verzi a předáte pro tento příznak true, nepotřebujete obal PL/SQL kolem dropu; můžete ponechat oddělovač středník a vrátit se na:
DROP TABLE table_a;
CREATE TABLE table_a
(
id VARCHAR(5) PRIMARY KEY,
name VARCHAR(100)
);
...
Pokud váš skript schématu obsahuje jakékoli jiné PL/SQL – spouštěč, balíčky atd. – pak budete muset pro všechno stále používat oddělovač lomítka (nebo jakýkoli jiný oddělovač podle vašeho výběru; lomítko je však tradiční).