Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Tebas atau Tanpa Tebas?

Itulah pertanyaannya.

Sebuah posting baru-baru ini di forum OTN menanyakan tentang penggunaan titik koma dan garis miring sebagai terminator pernyataan. Saya membersihkan artikel yang saya tulis untuk tim pengembangan kami lebih dari 4 tahun yang lalu tentang topik ini. Artikel ini mendapat ulasan bagus dan tersedia di forum OTN jika diinginkan. Saya pikir saya juga akan mempostingnya di blog saya. Ini artikelnya:

Slash atau Tanpa Slash

oleh Brian Peasland

Di perusahaan kami, skrip SQL yang digunakan dijalankan di utilitas baris perintah SQL*Plus Oracle, sedangkan banyak pengembang menggunakan alat GUI seperti Pengembang PL/SQL atau Pengembang SQL. Garis miring ke depan berarti sesuatu untuk SQL*Plus yang tidak diperlukan di PL/SQL Developer atau SQL Developer. Dengan demikian, dapat membingungkan untuk mengetahui apakah Anda perlu memasukkan garis miring ke dalam skrip SQL Anda atau tidak. Mudah-mudahan, bagian ini akan menjelaskan apa yang dilakukan garis miring, kapan menggunakannya, dan kapan tidak menggunakannya. Semi-colon Terminator Untuk sebagian besar pernyataan SQL, titik koma adalah terminator pernyataan. Misalnya, pertimbangkan pernyataan SQL sederhana ini yang dijalankan di SQL*Plus:

SQL> pilih sysdate dari dual;

SYSDATE

———

18-JUN-12

Ketika SQL*Plus melihat titik koma, ia mengetahui akhir dari pernyataan SQL telah tercapai dan sekarang dapat menjalankan perintah.

SQL*Plus Buffer

Anda mungkin tidak menyadari bahwa SQL*Plus memiliki buffer untuk perintahnya. Jika saya menekan tombol 'l' untuk 'daftar', maka saya dapat melihat perintah saat ini di buffer sesi saya.

SQL> l

1* pilih sysdate dari dual

Tidak mengherankan, ada perintah yang baru saja saya jalankan. Saya kemudian mengeksekusi pernyataan SQL lain dan inilah tampilan buffer saya sekarang:

SQL> l

1 pilih sysdate,user

2* dari ganda

Seperti yang Anda lihat, saya sekarang memiliki dua baris di buffer SQL*Plus sesi saya.

Slash =Jalankan Buffer

Aturan pertama yang harus dipahami tentang garis miring adalah bahwa untuk SQL*Plus, garis miring berarti mengeksekusi isi buffer. Untuk mengilustrasikan konsep ini, saya akan mengeksekusi pernyataan SQL, tunggu beberapa detik, lalu jalankan lagi pernyataan SQL yang sama tetapi hanya mengeksekusi buffer.

SQL> pilih to_char(sysdate,'MM/DD/YYYY HH24:MI:SS') dari dual;

TO_CHAR(SYSDATE,'MM

——————-

18/06/2012 15:20:40

SQL> /
TO_CHAR(SYSDATE,'MM

——————-

18/06/2012 15:21:17

SQL> /

TO_CHAR(SYSDATE,'MM

——————-

18/06/2012 15:21:50

Anda dapat melihat bahwa yang saya lakukan untuk kedua dan ketiga kalinya hanyalah mengetik '/' dan tekan enter dan SQL*Plus mengeksekusi isi buffer perintahnya setiap kali.

Blok PL/SQL

Terminator pernyataan titik koma bekerja dengan baik dengan sendirinya sampai Oracle memperkenalkan PL/SQL di Oracle versi 7. Masalahnya adalah bahwa blok PL/SQL dapat memiliki beberapa titik koma untuk mengakhiri pernyataan individu yang membentuk blok itu. Pertimbangkan blok PL/SQL yang sangat sederhana ini yang tidak melakukan apa-apa:

SQL> mulai

2 nol;

3 nol;

4 akhir;

5

Baris 2 dan 3 berisi pernyataan yang benar-benar valid yang masing-masing diakhiri dengan titik koma. Dan pada baris 4, kita memiliki kata kunci END yang menandakan akhir dari blok PL/SQL. Jika kami tidak diizinkan memasangkan BEGIN/END bersarang, maka setiap kali SQL*Plus melihat “END;” itu akan mengetahui akhir dari blok PL/SQL telah tercapai, tetapi kami diizinkan memasangkan BEGIN/END bersarang sehingga yang berikut ini benar-benar sah dan valid:

SQL> mulai

2 mulai

3 nol;

4 akhir;

5 nol;

6 selesai;

7

Anda dapat mengetahui dari atas bahwa hanya mencari "AKHIR;" tidak cukup karena SQL*Plus akan mencoba menjalankan blok setelah baris 4. Jadi, bagaimana Oracle memutuskan untuk menandakan bahwa blok PL/SQL sudah siap untuk dieksekusi? Jawabannya adalah dengan menggunakan garis miring seperti yang mungkin sudah Anda ketahui. Aturan kedua yang harus dipahami adalah bahwa semua garis miring yang dilakukan saat Anda menggunakannya untuk mengakhiri blok PL/SQL adalah dengan memberi tahu SQL*Plus untuk menjalankan apa yang ada di buffer! Ini tidak berubah sejak sebelum PL/SQL dibuat untuk Oracle 7. Perhatikan contoh berikut:

SQL> mulai

2 nol;

3 akhir;

4 /

Prosedur PL/SQL berhasil diselesaikan.

SQL> l

1 mulai
2 null;

3* selesai;

Pada baris 4, saya mengetikkan garis miring untuk mengeksekusi blok PL/SQL. Anda dapat melihat bahwa blok saya berhasil diselesaikan. Jika kita kembali dan melihat isi buffer perintah saya, Anda dapat melihatnya berisi semuanya kecuali garis miring. Garis miring bukan bagian dari buffer perintah. Jadi sekarang, saya akan menjalankan blok PL/SQL yang berbeda:

SQL> mulai

2 dbms_output.put_line(‘Hari ini adalah ‘||to_char(tanggal sistem,’MM/DD/YYYY HH24:MI:SS’));

3 akhir;

4 /

Hari ini 18/06/2012 15:39:32

Prosedur PL/SQL berhasil diselesaikan.

Garis miring mengatakan ke SQL*Plus untuk menjalankan apa yang ada di buffernya, dan hasilnya ditampilkan. Sekarang mari kita ketik garis miring lagi dan kita akan melihat blok PL/SQL kita dieksekusi lagi.

SQL> /

Hari ini 18/06/2012 15:40:42

Prosedur PL/SQL berhasil diselesaikan.

Saya tidak perlu mengetikkan blok PL/SQL saya lagi karena saat ini berada di buffer perintah.

PL/SQL dan Pengembang SQL dan Blok PL/SQL

Masalah terbesar bagi sebagian besar pengembang adalah bahwa Pengembang PL/SQL dan Pengembang SQL tidak mengharuskan Anda menggunakan garis miring. Mengapa? Karena Anda dapat menekan Execute (F8) atau Run Script (F5) untuk menjalankan blok PL/SQL Anda. Pengembang PL/SQL tahu bahwa saat Anda menekan F8, Anda bermaksud mengirimkan blok PL/SQL untuk dieksekusi. Dalam hal ini, F8 di PL/SQL Developer melakukan pekerjaan yang sama seperti garis miring di SQL*Plus. Demikian pula, untuk F5 di SQL Developer.

Masalah di perusahaan saya adalah tim kami yang menyebarkan kode ke produksi tidak menyebarkan kode dengan Pengembang PL/SQL atau Pengembang SQL. Mereka menggunakan SQL*Plus karena membuat skrip beberapa eksekusi lebih mudah dengan alat baris perintah. Banyak pengembang membuat kesalahan dengan tidak menyertakan garis miring untuk blok PL/SQL dalam skrip karena mereka tidak membutuhkannya, tetapi jika Anda ingin menerapkan bagian kode itu dalam skrip SQL, garis miring diperlukan di akhir setiap PL /SQL blok.

Saat Tidak Menggunakan Slash

Jadi kami telah melihat kapan dan mengapa kami menggunakan garis miring, tetapi kapan buruk menggunakannya? Aturan ketiga yang perlu diketahui adalah buruknya menggunakan garis miring yang mengikuti satu pernyataan SQL (bukan dalam blok PL/SQL), terutama ketika garis miring itu segera mengikuti pernyataan DML (INSERT, UPDATE, atau DELETE). Jika skrip saya berisi yang berikut:

pilih sysdate dari dual;

/

Kemudian saya akan mendapatkan "output ganda" yang biasanya tidak ingin saya lakukan dalam sebuah skrip. Saya benar-benar hanya ingin satu baris dikembalikan, bukan dua seperti yang akan dilakukan skrip di atas:

SQL> pilih sysdate dari dual;

SYSDATE

———

18-JUN-12
SQL> /

SYSDATE

———

18-JUN-12

Lebih buruk lagi ketika saya menggunakan garis miring setelah pernyataan DML karena pernyataan itu akan dieksekusi dua kali. Perhatikan skrip berikut:

masukkan ke dalam nilai test_tab (10);

/

Kita sekarang tahu bahwa ketika saya menjalankan dua baris di atas dalam sebuah skrip, SQL*Plus akan mengeksekusinya sekali karena terminator pernyataan titik koma dan kemudian mengeksekusi kedua kalinya karena garis miring memberi tahu SQL*Plus untuk menjalankan apa yang ada di penyangga perintah. Ketika saya menjalankan skrip dua baris di atas, saya mendapatkan output berikut:

SQL> masukkan ke dalam nilai test_tab (10);

1 baris dibuat.

SQL>

/

masukkan ke dalam nilai test_tab (10) *

KESALAHAN pada baris 1:ORA-00001:batasan unik (PEASLAND.SYS_C00767176) dilanggar

Ups! Sisipan pertama berhasil (1 baris dibuat.) tetapi ketika garis miring dimasukkan, SQL*Plus mencoba memasukkan data yang sama dan saya terjebak pada pelanggaran batasan yang unik.

Kesimpulan

Mudah-mudahan, halaman ini menunjukkan mengapa garis miring diperlukan, apa yang dilakukan, dan kapan tidak menggunakannya. Untuk rekap:

  • Sertakan garis miring di akhir setiap blok PL/SQL
  • Jangan sertakan garis miring setelah pernyataan SQL apa pun yang tidak ada dalam blok PL/SQL.
  • Garis miring setelah satu pernyataan SQL akan menyebabkan perintah SQL tersebut dieksekusi dua kali.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. tampilkan teks khusus sql dari hasil kolom tabel

  2. BITAND() Fungsi di Oracle

  3. meneruskan array integer ke prosedur Oracle dengan c #

  4. Hilangkan duplikat menggunakan fungsi Oracle LISTAGG

  5. 2 Cara Mengembalikan Baris yang Hanya Mengandung Karakter Alfanumerik di Oracle