Karakter Untuk Berkomentar di SQL * Plus - Funkysst.com

Friday, January 19, 2018

Karakter Untuk Berkomentar di SQL * Plus

Avertisement
Avertisement
The # karakter untuk berkomentar di SQL * Plus, kan?




Karakter # telah banyak digunakan untuk komentar dalam banyak bahasa, seperti script shell dan python. Menariknya # sintaks hukum di SQL scripting juga; tapi itu dianggap komentar? Jawabannya adalah tidak; ini bukan. Tujuan # dalam skrip SQL sangat berbeda. dan Anda harus sangat berhati-hati menggunakannya.

Memasuki # memberitahu SQL * Plus untuk sementara berhenti apa yang telah masuk sebelum dan mengeksekusi semuanya setelah #sign itu, seolah-olah dalam sesi yang berbeda. Berikut adalah usecase a. Misalkan Anda menulis query ini:

SQL> pilih *
  2   dari v $ sesstat
  3   mana

[Tipografis Konvensi: User input akan ditampilkan tebal . Output sistem tidak. ]

Pada saat ini Anda terjebak. Anda tidak ingat nama-nama kolom dari V $ SESSTAT. Tapi Anda perlu tahu bahwa untuk menggunakannya sebagai predikat. Apa yang bisa kau lakukan? Anda hanya bisa tekan ENTER pada saat ini, yang menyebabkan * SQL Plus prompt untuk ditampilkan kembali. Anda bisa menggambarkan pandangan dan yang akan menjadi jawaban Anda. Namun, ini berarti Anda akan kehilangan semua masukan yang telah Anda masukkan sampai saat itu. Dalam kasus query panjang yang rumit itu hampir tidak diinginkan.

Di sinilah simbol # datang untuk membantu. Cukup ketik # dan masukkan perintah yang ingin ditampilkan. Dalam hal ini Anda ingin menggambarkan pandangan. Jadi masukkan di garis cepat 4 dari SQL * Plus:

  4   #desc v $ sesstat

Bila Anda memasukkan perintah ini dan tekan ENTER, SQL * Plus akan menghentikan evaluasi semua perintah itu dilakukan dan melaksanakan desc v $ sessta t perintah. Berikut akan menjadi output:

 Nama Null? Mengetik
 ----------------------------------------- -------- - ---------
 SID NOMOR
 STATISTIK # NOMOR
 NILAI NOMOR
 CON_ID NOMOR

Setelah tampilan ini, SQL * Plus prompt akan menunjukkan garis-4 sebagai prompt "4". Sekarang Anda tahu kolom, masukkan sisa pernyataan SQL Anda memasuki

  4   con_id = 1 
  5   /

Dan hanya itu. Perhatikan bagaimana SQL * Plus tidak membuang salah satu perintah yang sudah dimasukkan. Sebaliknya itu hanya berhenti evaluasi dan mulai mengevaluasi perintah "desc v $ sesstat" setelah simbol #. Ini simbol "#" bukan karakter komentar tapi perintah baru sementara tanpa membuang perintah sebelumnya dalam bermain dalam sesi.

Dampak negatif yang tidak diinginkan

Perilaku ini # karakter dapat mengakibatkan beberapa skenario sama sekali tidak dimaksudkan. Ambil contoh skenario berikut. Kami membuat tabel, menyisipkan baris, tidak komit dan kemudian memeriksa jumlah record.

SQL> membuat tabel t (nomor col1);

Tabel dibuat.

SQL> masukkan ke nilai t (1);

1 baris dibuat.

SQL> select count (1)
  2   dari t
  3   mana 1> 0
  4   /

  COUNT (1)
----------
         1

Kami mendapat hasil seperti yang diharapkan. Sekarang mari kita memperkenalkan #roll garis kecil di antara perintah. Mungkin kita menganggap itu komentar dan meninggalkannya di sana.

SQL> select count (1)
  2   #roll
Rollback lengkap.
  2   dari t
  3   mana 1> 0
  4   /

  COUNT (1)
----------
         0

Perhatikan bagaimana menghitung kembali sebagai 0. Mengapa? Itu karena rollback terjadi secara independen dari pilih perintah. Pada saat pernyataan pilih selesai, pernyataan rollback telah digulung kembali insert dan karenanya tidak ada baris dalam tabel.

Dalam beberapa kasus perilaku ini mungkin terbukti mematikan. Berikut adalah contoh lain yang saya lihat, dari naskah yang menutup database, mengambil snapshot penyimpanan dan restart.

shutdown yang batalkan
memulai

Kemudian diputuskan bahwa penutupan batalkan tidak diinginkan. Ini harus mati transaksional . Jadi, DBA berubah script berikut. Dengan asumsi karakter # untuk menjadi komentar, dia pikir dia berkomentar garis bukannya menghapus:

#shutdown batalkan
shutdown yang transaksional
memulai

Sekarang mari kita menjalankan script:

SQL> @b
ORACLE instance Ditutup.
KESALAHAN:
ORA-01.034: ORACLE tidak tersedia
ORA-27101: shared ranah memori tidak ada
Proses ID: 0
Sesi ID: 0 Serial number: 0
ORACLE instance Mulai.

Sistem Jumlah Global Area 5117050880 byte
Tetap Ukuran 8757424 bytes
Variabel Ukuran 1056968528 byte
Database Buffer 4043309056 byte
Redo Buffer 8015872 bytes
Database dipasang.
Database yang dibuka.                                                                                                                    

Apa yang terjadi? shutdown gagal dengan "ORACLE tidak tersedia". Mengapa?

Jawabannya sederhana. Shutdown batalkan dieksekusi. Database sudah turun. Oleh karena itu penutupan transaksional gagal.

Jangan Suka #?

Sekarang bahwa Anda melihat bagaimana beberapa orang mungkin bingung # sebagai komentar dan membuat kesalahan, Anda mungkin tidak ingin memiliki properti khusus ditugaskan untuk #. Sebaliknya, Anda mungkin ingin karakter lain, mengatakan "*". Anda dapat dengan mudah mengubahnya. Pengaturan khusus di SQL * Plus disebut SQLPREFIX memungkinkan Anda untuk melakukan itu:

SQL> set sqlprefix *

Sekarang, mari kita ulangi contoh yang sama kita gunakan sebelumnya tapi dengan * bukannya #:

SQL> select count (1)
  2   * desc t
 Nama Null? Mengetik
 ----------------------------------------- -------- - -------
 COL1 NOMOR

  2   dari t;

  COUNT (1)
----------
         0

Bagaimana jika Anda menggunakan # karakter dalam kasus ini?

SQL> select count (1)
  2   # desc t
  3   dari t;
# Info t
*
ERROR pada baris 2:
ORA-00911: karakter tidak valid

Anda tidak akan pergi ke mana pun. Anda akan mendapatkan error. Ini mungkin lebih baik daripada asumsi # karakter sebagai komentar.

takeaways

  1. Karakter # bukan komentar di script SQL.
  2. Ketika SQL * Plus bertemu dengan # karakter pada posisi pertama, sementara berhenti evaluasi laporan yang masuk dan segera mengeksekusi perintah setelah # dan resume evaluasi perintah dimasukkan sebelumnya setelah itu.
  3. Anda dapat menetapkan karakter lain untuk menunjukkan perilaku ini dengan menetapkan SQLPREFIX untuk karakter itu.
Avertisement
Comments


EmoticonEmoticon