Oracle
 sql >> Database >  >> RDS >> Oracle

Impossibile utilizzare DROP TABLE IF EXISTS in schema.sql per un'applicazione Spring Boot

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.