Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Không thể sử dụng DROP TABLE NẾU TỒN TẠI trong schema.sql cho ứng dụng Spring Boot

Bạn chưa hiển thị mã Java của mình, nhưng từ dấu vết ngăn xếp, có vẻ như bạn đang gọi ScriptUtil's executeSqlScript() phương pháp , đã sử dụng dấu phân tách câu lệnh dấu chấm phẩy mặc định.

Nó không nhận dạng khối PL / SQL là một đơn vị duy nhất và thay vào đó, nó đang cố gắng chạy mọi thứ lên đến dấu chấm phẩy đầu tiên dưới dạng một câu lệnh SQL độc lập - điều này không hợp lệ và gây ra lỗi bạn đang thấy.

Bạn có thể sử dụng the phiên bản của executeSqlScript() cho phép bạn ghi đè mặc định và sử dụng / thay vào đó:

điều đó có nghĩa là tất cả các câu lệnh SQL trong tập lệnh của bạn sẽ phải sử dụng / dấu phân tách thay vì dấu chấm phẩy nữa:

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

...

Như đã lưu ý trong các nhận xét, dù sao thì khối ban đầu của bạn cũng không ổn lắm; và create không cần phải thực hiện thông qua PL / SQL, ngay cả khi drop cần phải được.

Nhưng phương thức đó cũng có ignoreFailedDrops cờ, có vẻ như làm chính xác những gì bạn muốn (mặc dù vậy, tôi không thể kiểm tra nó để kiểm tra):

Nếu bạn sử dụng phiên bản đó và chuyển true cho cờ đó, bạn không cần trình bao bọc PL / SQL xung quanh drop; bạn có thể giữ dấu phân tách bằng dấu chấm phẩy và hoàn nguyên về:

DROP TABLE table_a;

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

...

Nếu tập lệnh lược đồ của bạn chứa bất kỳ PL / SQL nào khác - trình kích hoạt, gói, v.v. - thì bạn vẫn cần chuyển sang sử dụng dấu phân tách dấu gạch chéo (hoặc bất kỳ dấu phân tách nào khác mà bạn chọn; dấu gạch chéo là truyền thống) cho mọi thứ.



  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 PLSQL trả về một loại hàng

  2. Câu lệnh SQL tham gia Oracle và MS SQL Server

  3. Cách thêm số thứ tự cho từng phần tử trong nhóm bằng truy vấn SQL không có bảng tạm thời

  4. Nhận CHIỀU DÀI CỦA NGUYÊN LIỆU DÀI

  5. Phép nối bên ngoài bên trái của Oracle XMLTABLE không trả về kết quả khi XPath không tồn tại