Kadang-kadang saya akan mendapatkan skrip yang akan berjalan baik di SQL Developer atau Toad, tetapi membutuhkan modifikasi agar dapat dijalankan dengan sukses dari SQL * Plus. Berikut ini adalah contoh kasus terburuk yang berisi beberapa pernyataan, masing-masing dengan garis kosong, titik koma, dan garis miring:
INSERT INTO t1 VALUES ('a
;
/
');
INSERT INTO t1 VALUES ('b
;
/
');
DELETE FROM t1 WHERE c1 = 'c
;
/
';
Untuk berbagai alasan pernyataan ini perlu dijalankan dari SQL * Plus. Garis kosong mudah untuk diselesaikan dengan ...
set sqlblanklines on
Saya menyadari bahwa sqlterminator
dapat diubah dan / atau dimatikan, tetapi keduanya akan memerlukan modifikasi pada kode, yang pertama memindahkan masalah tanpa menyelesaikannya dan tidak menyelesaikan masalah slash yang tertanam.
Jawaban terbaik adalah cara untuk memungkinkan pernyataan ini berjalan tanpa modifikasi dengan mengubah lingkungan dalam beberapa cara (seperti yang dilakukan sqlblanklines). Jika itu tidak mungkin, maka mungkin ada cara untuk memodifikasi skrip secara terprogram. Saya mencoba menghindari perubahan manual.
sumber
Jawaban:
Anda dapat melakukan sebagian besar dari ini dengan menggunakan login.sql. login.sql dijalankan selama - mengejutkan - login dan diambil dari SQLPATH Anda atau direktori saat ini. Untuk contoh yang Anda berikan, Anda benar-benar memilih kasus terburuk.
Masalahnya adalah sqlterminator. Apa pun yang Anda masukkan ke sana, garis miring akan dipertahankan sebagai sqlterminator gratis. Di sebelahnya, sqlplus memindai pertama untuk sqlterminator dan melakukan ini sebelum memindai ke terminator string. Bug jika Anda bertanya kepada saya. Garis miring ke depan dapat digunakan dalam string selama itu tidak sendirian pada garis yang terpisah. Segera setelah sqlplus menemukan karakter yang ditentukan sebagai sqlterminator, ia mengabaikan semua yang lain dan berhenti membaca.
Garis miring ke depan dapat ditangani, asalkan tidak sendirian di garis.
login.sql berisi:
leigh.sql berisi:
jalankan skrip:
Tidak perlu bermain-main dengan blok awal / akhir. Tidak dapat menangani sqlterminator di dalam perintah, di mana pun ia berada, dalam sebuah string atau tidak, tidak dapat menangani garis dengan garis miring sendiri pada garis dalam string.
sumber
Masukkan pernyataan dengan garis kosong dan semi-titik dua akan berhasil jika ditempatkan di dalam BEGIN ... END blok. Perubahan ini bisa dilakukan dengan menggunakan skrip, tetapi skrip akan gagal jika berisi pernyataan DDL yang tidak dapat dijalankan di dalam blok tanpa langsung dieksekusi.
Solusi ini juga tidak menyelesaikan masalah tertanam /.
sumber
Solusi saya:
Sepertinya terminator perintah diabaikan di dalam pernyataan body.
sumber
sumber