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ứ.