sql >> Databáze >  >> RDS >> Oracle

Nelze použít DROP TABLE IF EXISTS v schema.sql pro aplikaci Spring Boot

Neukázali jste svůj kód Java, ale z trasování zásobníku to vypadá, že voláte executeSqlScript() ScriptUtil metoda , který používal výchozí oddělovač příkazů středníkem.

Neuznává blok PL/SQL jako jednu jednotku a místo toho se pokouší spustit vše až po první středník jako samostatný příkaz SQL – což není platné a způsobuje chybu, kterou vidíte.

Můžete použít verzi executeSqlScript() což vám umožní přepsat výchozí a použít / místo toho:

což by znamenalo, že všechny příkazy SQL ve vašem skriptu by musely používat / také oddělovač místo středníku:

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

...

Jak je uvedeno v komentářích, váš původní blok stejně nebyl úplně správný; a create nemusí být provedeno přes PL/SQL, i když drop musí být.

Ale tato metoda má také ignoreFailedDrops flag, který vypadá, že dělá přesně to, co chcete (nemohu to však otestovat):

Pokud použijete tuto verzi a předáte pro tento příznak true, nepotřebujete obal PL/SQL kolem dropu; můžete ponechat oddělovač středník a vrátit se na:

DROP TABLE table_a;

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

...

Pokud váš skript schématu obsahuje jakékoli jiné PL/SQL – spouštěč, balíčky atd. – pak budete muset pro všechno stále používat oddělovač lomítka (nebo jakýkoli jiný oddělovač podle vašeho výběru; lomítko je však tradiční).



  1. Hibernace mysql innodb

  2. Připojení aplikace Heroku Lumen k Amazon RDS MySQL 5.7.19

  3. Jak na serveru SQL Server najdu všude, kde se odkazuje na sloupec?

  4. Výzkum pomalosti PostGIS (vydání 2019)