Você não mostrou seu código Java, mas pelo rastreamento de pilha parece que você está chamando
executeSqlScript()
do ScriptUtil método
, que usava o separador de instrução de ponto e vírgula padrão. Ele não está reconhecendo o bloco PL/SQL como uma única unidade e, em vez disso, está tentando executar tudo até o primeiro ponto e vírgula como uma instrução SQL autônoma - o que não é válido e causa o erro que você está vendo.
Você pode usar o versão de
executeSqlScript()
que permite substituir o padrão e usar /
em vez de:o que significaria que todas as instruções SQL em seu script teriam que usar um
/
separador em vez de um ponto e vírgula também: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)
)
/
...
Conforme observado nos comentários, seu bloqueio original não estava certo de qualquer maneira; e o
create
não precisa ser feito através de PL/SQL, mesmo se o drop
precisa ser. Mas esse método também tem um
ignoreFailedDrops
flag, que parece fazer exatamente o que você quer (não posso testá-lo para verificar):Se você usar essa versão e passar true para esse sinalizador, não precisará do wrapper PL/SQL ao redor do drop; você pode manter o separador de ponto e vírgula e reverter para:
DROP TABLE table_a;
CREATE TABLE table_a
(
id VARCHAR(5) PRIMARY KEY,
name VARCHAR(100)
);
...
Se o seu script de esquema contiver qualquer outro PL/SQL - gatilho, pacotes, etc. -, você ainda precisará usar o separador de barra (ou qualquer outro separador de sua escolha; uma barra é tradicional) para tudo.