Kami telah memiliki beberapa perdebatan minggu ini di perusahaan saya tentang bagaimana kita harus menulis skrip SQL kami.
Latar Belakang: Basis data kami adalah Oracle 10g (segera ditingkatkan menjadi 11). Tim DBA kami menggunakan SQLPlus untuk menyebarkan skrip kami ke produksi.
Sekarang, kami memiliki penyebaran baru-baru ini yang gagal karena telah menggunakan titik koma dan garis miring ( /
). Tanda titik koma ada di akhir setiap pernyataan dan garis miring berada di antara pernyataan.
alter table foo.bar drop constraint bar1;
/
alter table foo.can drop constraint can1;
/
Ada beberapa pemicu yang ditambahkan kemudian dalam skrip, beberapa tampilan dibuat serta beberapa prosedur tersimpan. Memiliki kedua ;
dan /
menyebabkan setiap pernyataan berjalan dua kali menyebabkan kesalahan (terutama pada sisipan, yang perlu unik).
Di SQL Developer ini tidak terjadi, di TOAD ini tidak terjadi. Jika Anda menjalankan perintah tertentu mereka tidak akan berfungsi tanpa /
di dalamnya.
Dalam PL / SQL jika Anda memiliki subprogram (DECLARE, BEGIN, END) titik koma yang digunakan akan dianggap sebagai bagian dari subprogram, jadi Anda harus menggunakan garis miring.
Jadi pertanyaan saya adalah ini: Jika database Anda adalah Oracle, apa cara yang tepat untuk menulis skrip SQL Anda? Karena Anda tahu bahwa DB Anda adalah Oracle, haruskah Anda selalu menggunakannya /
?
sqlterminator
untuk!
jika Anda suka) dan konvensi ini cenderung diikuti oleh alat-alat lain. Namun, bahasa PL / SQL menggunakan titik koma sebagai elemen sintaks wajib.Jawaban:
Ini masalah preferensi, tapi saya lebih suka melihat skrip yang secara konsisten menggunakan garis miring - dengan cara ini semua "unit" kerja (membuat objek PL / SQL, menjalankan blok anonim PL / SQL, dan menjalankan pernyataan DML) dapat berupa dipilih lebih mudah dengan mata.
Juga, jika Anda akhirnya pindah ke sesuatu seperti Semut untuk ditempatkan, itu akan menyederhanakan definisi target untuk memiliki pembatas pernyataan yang konsisten.
sumber
/
atau;
melihat jawaban @a_horse_with_no_name atau @Mr_Moneybags untuk lebih banyak konteksSaya tahu ini adalah utas lama, tetapi saya baru saja menemukannya dan saya merasa ini belum dijelaskan sepenuhnya.
Ada perbedaan besar dalam SQL * Plus antara arti a
/
dan a;
karena mereka bekerja secara berbeda.Yang
;
mengakhiri pernyataan SQL, sedangkan/
mengeksekusi apa pun yang ada di "buffer" saat ini. Jadi, ketika Anda menggunakan;
dan sebuah/
pernyataan sebenarnya dieksekusi dua kali.Anda dapat dengan mudah melihat bahwa menggunakan
/
setelah menjalankan pernyataan:Dalam hal ini orang benar-benar memperhatikan kesalahan.
Tetapi dengan asumsi ada skrip SQL seperti ini:
Dan ini dijalankan dari dalam SQL * Plus maka ini akan sangat membingungkan:
The
/
terutama diperlukan dalam rangka untuk menjalankan pernyataan yang telah tertanam;
sepertiCREATE PROCEDURE
pernyataan.sumber
;
) maka Anda perlu menemukan cara untuk menentukan pembatas alternatifSaya ingin mengklarifikasi lebih banyak penggunaan antara
;
dan/
Dalam SQLPLUS:
;
berarti "mengakhiri pernyataan saat ini, jalankan dan simpan ke buffer SQLPLUS"<newline>
setelah pernyataan DML (SELECT, UPDATE, INSERT, ...) atau beberapa jenis pernyataan DDL (Membuat Tabel dan Tampilan) (yang tidak mengandung;
), itu artinya, menyimpan pernyataan itu ke buffer tetapi tidak menjalankannya./
setelah memasukkan pernyataan ke dalam buffer (dengan kosong<newline>
) berarti "jalankan DML atau DDL atau PL / SQL di buffer.RUN
atauR
adalah perintah sqlsplus untuk menampilkan / menampilkan SQL dalam buffer dan menjalankannya. Itu tidak akan mengakhiri Pernyataan SQL./
selama memasukkan DML atau DDL atau PL / SQL berarti "mengakhiri pernyataan saat ini, jalankan dan simpan ke buffer SQLPLUS"CATATAN: Karena
;
digunakan untuk PL / SQL untuk mengakhiri pernyataan;
tidak dapat digunakan oleh SQLPLUS berarti "mengakhiri pernyataan saat ini, jalankan dan simpan ke buffer SQLPLUS" karena kami ingin seluruh blok PL / SQL sepenuhnya di buffer, lalu jalankan. Blok PL / SQL harus diakhiri dengan:sumber
Hampir semua penyebaran Oracle dilakukan melalui SQL * Plus (alat baris perintah kecil yang aneh yang digunakan DBA Anda). Dan dalam SQL * Plus sebuah slash tunggal pada dasarnya berarti "jalankan kembali perintah SQL atau PL / SQL terakhir yang baru saja saya jalankan".
Lihat
Aturan praktisnya adalah menggunakan tebasan dengan hal-hal yang dilakukan
BEGIN .. END
atau di mana Anda dapat menggunakannyaCREATE OR REPLACE
.Untuk sisipan yang perlu digunakan secara unik
sumber
Dari pemahaman saya, semua pernyataan SQL tidak perlu garis miring karena mereka akan berjalan secara otomatis di akhir titik koma, termasuk pernyataan DDL, DML, DCL dan TCL.
Untuk blok PL / SQL lainnya, termasuk Prosedur, Fungsi, Paket dan Pemicu, karena mereka adalah beberapa program garis, Oracle perlu cara untuk mengetahui kapan harus menjalankan blok, jadi kita harus menulis garis miring di akhir setiap blok untuk biarkan Oracle yang menjalankannya.
sumber
Saya hanya menggunakan garis miring sekali pada akhir setiap skrip, untuk memberi tahu sqlplus bahwa tidak ada lagi baris kode. Di tengah naskah, saya tidak menggunakan garis miring.
sumber