Non hai mostrato il tuo codice Java, ma dalla traccia dello stack sembra che tu stia chiamando executeSqlScript()
di ScriptUtil metodo
, che utilizzava il separatore di istruzione punto e virgola predefinito.
Non riconosce il blocco PL/SQL come una singola unità e tenta invece di eseguire tutto fino al primo punto e virgola come un'istruzione SQL autonoma, che non è valida e causa l'errore visualizzato.
Puoi utilizzare il versione di executeSqlScript()
che ti consente di ignorare l'impostazione predefinita e utilizzare /
invece:
il che significherebbe che tutte le istruzioni SQL nel tuo script dovrebbero utilizzare un /
separatore invece di un punto e virgola anche:
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)
)
/
...
Come notato nei commenti, il tuo blocco originale non era comunque corretto; e il create
non deve essere eseguito tramite PL/SQL, anche se il drop
deve essere.
Ma quel metodo ha anche un ignoreFailedDrops
flag, che sembra fare esattamente quello che vuoi (non posso testarlo per verificare però):
Se usi quella versione e passi true per quel flag non hai bisogno del wrapper PL/SQL attorno al drop; puoi mantenere il punto e virgola separatore e tornare a:
DROP TABLE table_a;
CREATE TABLE table_a
(
id VARCHAR(5) PRIMARY KEY,
name VARCHAR(100)
);
...
Se lo script dello schema contiene qualsiasi altro PL/SQL - trigger, pacchetti, ecc. - allora dovrai comunque passare all'utilizzo del separatore barra (o qualsiasi altro separatore a tua scelta; una barra è comunque tradizionale) per tutto.