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.