Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Não é possível usar DROP TABLE IF EXISTS no schema.sql para um aplicativo Spring Boot


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.