Anda belum menunjukkan kode Java Anda, tetapi dari pelacakan tumpukan sepertinya Anda memanggil executeSqlScript()
ScriptUtil metode
, yang menggunakan pemisah pernyataan titik koma default.
Itu tidak mengenali blok PL/SQL sebagai satu unit, dan malah mencoba menjalankan semuanya hingga titik koma pertama sebagai pernyataan SQL mandiri - yang tidak valid dan menyebabkan kesalahan yang Anda lihat.
Anda dapat menggunakan the versi executeSqlScript()
yang memungkinkan Anda mengganti default dan menggunakan /
sebagai gantinya:
yang berarti semua pernyataan SQL dalam skrip Anda harus menggunakan /
pemisah, bukan titik koma juga:
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)
)
/
...
Seperti yang disebutkan dalam komentar, blok asli Anda tidak sepenuhnya benar; dan create
tidak perlu dilakukan melalui PL/SQL, bahkan jika drop
perlu.
Tetapi metode itu juga memiliki ignoreFailedDrops
flag, yang tampaknya melakukan persis seperti yang Anda inginkan (meskipun saya tidak dapat mengujinya untuk memeriksa):
Jika Anda menggunakan versi itu dan memberikan true untuk flag itu, Anda tidak memerlukan pembungkus PL/SQL di sekitar drop; Anda dapat menyimpan pemisah titik koma dan kembali ke:
DROP TABLE table_a;
CREATE TABLE table_a
(
id VARCHAR(5) PRIMARY KEY,
name VARCHAR(100)
);
...
Jika skrip skema Anda berisi PL/SQL lain - pemicu, paket, dll. - maka Anda masih perlu beralih menggunakan pemisah garis miring (atau pemisah lain pilihan Anda; garis miring adalah tradisional) untuk semuanya.