Oracle
 sql >> Base de données >  >> RDS >> Oracle

Impossible d'utiliser DROP TABLE IF EXISTS dans schema.sql pour une application Spring Boot

Vous n'avez pas montré votre code Java, mais d'après la trace de la pile, il semble que vous appelez executeSqlScript() de ScriptUtil méthode , qui utilisait le séparateur d'instruction point-virgule par défaut.

Il ne reconnaît pas le bloc PL/SQL comme une seule unité et essaie plutôt de tout exécuter jusqu'au premier point-virgule en tant qu'instruction SQL autonome - ce qui n'est pas valide et provoque l'erreur que vous voyez.

Vous pouvez utiliser le version de executeSqlScript() qui vous permet de remplacer la valeur par défaut et d'utiliser / à la place :

ce qui signifierait que toutes les instructions SQL de votre script devraient utiliser un / séparateur au lieu d'un point-virgule également :

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)
  )
/

...

Comme indiqué dans les commentaires, votre bloc d'origine n'était pas tout à fait correct de toute façon ; et le create n'a pas besoin d'être fait via PL/SQL, même si le drop doit l'être.

Mais cette méthode a aussi un ignoreFailedDrops flag, qui semble faire exactement ce que vous voulez (je ne peux pas le tester pour vérifier) ​​:

Si vous utilisez cette version et que vous transmettez true pour cet indicateur, vous n'avez pas besoin de l'encapsuleur PL/SQL autour de la suppression ; vous pouvez conserver le séparateur point-virgule et revenir à :

DROP TABLE table_a;

CREATE TABLE table_a
(
    id                       VARCHAR(5) PRIMARY KEY,
    name                     VARCHAR(100)
);

...

Si votre script de schéma contient un autre PL/SQL - déclencheur, packages, etc. -, vous devrez toujours utiliser le séparateur de barre oblique (ou tout autre séparateur de votre choix; une barre oblique est cependant traditionnelle) pour tout.