sql >> Database >  >> RDS >> Oracle

Kan DROP TABLE IF EXISTS niet gebruiken in schema.sql voor een Spring Boot-toepassing

Je hebt je Java-code niet getoond, maar uit de stack-trace lijkt het alsof je ScriptUtil's executeSqlScript() methode , die het standaard scheidingsteken voor puntkomma's gebruikte.

Het herkent het PL/SQL-blok niet als een enkele eenheid en probeert in plaats daarvan alles tot aan de eerste puntkomma uit te voeren als een op zichzelf staande SQL-instructie - wat niet geldig is en de fout veroorzaakt die u ziet.

U kunt de versie van executeSqlScript() waarmee je de standaard kunt overschrijven en / . kunt gebruiken in plaats daarvan:

wat zou betekenen dat alle SQL-instructies in uw script een / . zouden moeten gebruiken scheidingsteken ook in plaats van een puntkomma:

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

...

Zoals opgemerkt in opmerkingen, was je oorspronkelijke blok toch niet helemaal goed; en de create hoeft niet via PL/SQL te gebeuren, zelfs als de drop moet zijn.

Maar die methode heeft ook een ignoreFailedDrops vlag, die precies lijkt te doen wat je wilt (ik kan het echter niet testen om te controleren):

Als je die versie gebruikt en waar voor die vlag doorgeeft, heb je de PL/SQL-wrapper rond de drop niet nodig; u kunt het scheidingsteken voor puntkomma's behouden en terugkeren naar:

DROP TABLE table_a;

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

...

Als uw schemascript een andere PL/SQL bevat - trigger, pakketten, enz. - dan moet u nog steeds voor alles overschakelen naar het gebruik van het scheidingsteken voor slash (of een ander scheidingsteken naar keuze; een schuine streep is echter traditioneel).



  1. MySql- of PHP-functie om lengte- en breedtegraad om te zetten in decimale graden

  2. Een primaire sleutel maken in SQL Server (T-SQL-voorbeelden)

  3. Wat is de lengte van een PHP-sessie-ID-tekenreeks?

  4. Hoe open ik mijn MySQL op mijn Raspberry Pi voor externe / externe verbindingen?