Oracle
 sql >> Datenbank >  >> RDS >> Oracle

DROP TABLE IF EXISTS kann in schema.sql für eine Spring Boot-Anwendung nicht verwendet werden

Sie haben Ihren Java-Code nicht angezeigt, aber aus dem Stack-Trace sieht es so aus, als würden Sie executeSqlScript() von ScriptUtil Methode , die das standardmäßige Semikolon-Anweisungstrennzeichen verwendet.

Es erkennt den PL/SQL-Block nicht als einzelne Einheit und versucht stattdessen, alles bis zum ersten Semikolon als eigenständige SQL-Anweisung auszuführen – was nicht gültig ist und den angezeigten Fehler verursacht.

Sie können the Version von executeSqlScript() Damit können Sie die Standardeinstellung überschreiben und / verwenden stattdessen:

was bedeuten würde, dass alle SQL-Anweisungen in Ihrem Skript einen / verwenden müssten Trennzeichen statt Semikolon auch:

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

...

Wie in den Kommentaren erwähnt, war Ihr ursprünglicher Block sowieso nicht ganz richtig; und das create muss nicht über PL/SQL erfolgen, auch wenn der drop sein muss.

Aber diese Methode hat auch ein ignoreFailedDrops Flag, das genau das zu tun scheint, was Sie wollen (ich kann es jedoch nicht testen, um es zu überprüfen):

Wenn Sie diese Version verwenden und für dieses Flag true übergeben, brauchen Sie den PL/SQL-Wrapper nicht um den Drop herum; Sie können das Semikolon-Trennzeichen beibehalten und zu:

zurückkehren
DROP TABLE table_a;

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

...

Wenn Ihr Schemaskript andere PL/SQL-Trigger, Pakete usw. enthält, müssen Sie dennoch für alles auf die Verwendung des Schrägstrich-Trennzeichens (oder eines anderen Trennzeichens Ihrer Wahl; ein Schrägstrich ist jedoch traditionell) umstellen.