Oracle
 sql >> база данни >  >> RDS >> Oracle

Не може да се използва DROP TABLE IF EXISTS в schema.sql за приложение за Spring Boot

Не сте показали своя Java код, но от трасирането на стека изглежда, че извиквате executeSqlScript() на ScriptUtil метод , който използва стандартния разделител на изрази за точка и запетая.

Той не разпознава PL/SQL блока като единична единица и вместо това се опитва да изпълни всичко до първата точка и запетая като самостоятелен SQL израз - което не е валидно и причинява грешката, която виждате.

Можете да използвате the версия на executeSqlScript() което ви позволява да замените по подразбиране и да използвате / вместо това:

което би означавало, че всички SQL изрази във вашия скрипт ще трябва да използват / също и разделител вместо точка и запетая:

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

...

Както беше отбелязано в коментарите, оригиналният ви блок така или иначе не беше съвсем правилен; и create не е необходимо да се прави чрез PL/SQL, дори ако drop трябва да бъде.

Но този метод също има ignoreFailedDrops флаг, който изглежда прави точно това, което искате (все пак не мога да го тествам, за да проверя):

Ако използвате тази версия и подадете true за този флаг, нямате нужда от PL/SQL обвивката около падането; можете да запазите разделителя точка и запетая и да се върнете към:

DROP TABLE table_a;

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

...

Ако вашият скрипт на схема съдържа друг PL/SQL - тригер, пакети и т.н. - тогава все пак ще трябва да преминете към използване на разделителя на наклонена черта (или друг разделител по ваш избор; наклонената черта обаче е традиционна) за всичко.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. грешка в разрешаването на името на функцията на oracle pl/sql

  2. oracle изпълнява незабавно не се изпълнява без никаква грешка

  3. Как да използвам тип таблица в оператор SELECT FROM?

  4. ORA-01843:невалиден месец при вмъкване на дата в Oracle

  5. Свързване към отдалечена Oracle DB с Nodejs чрез Oracledb драйвер