Anda tampaknya memiliki beberapa kebingungan tentang perbedaan antara variabel pengikatan di Oracle dan variabel substitusi di SQL*Plus.
Mari kita mulai dengan variabel substitusi. Variabel substitusi unik untuk SQL*Plus dan bukan bagian dari database. Mereka tidak akan berfungsi jika Anda mencoba menggunakannya dengan JDBC, misalnya.
Variabel substitusi hanya dapat menampung sepotong teks. Jika SQL*Plus menemukan variabel substitusi dalam baris input, variabel tersebut akan diganti dengan konten teksnya:
SQL> define subvar=X SQL> select * from dual where dummy = &subvar; old 1: select * from dual where dummy = &subvar new 1: select * from dual where dummy = X select * from dual where dummy = X * ERROR at line 1: ORA-00904: "X": invalid identifier
Perhatikan bahwa SQL*Plus mengganti variabel substitusi kami dengan nilai teksnya tanpa memperhatikan apakah itu memberi kami SQL yang valid. Pada contoh di atas, kami menghilangkan tanda kutip tunggal di sekitar &subvar
dan itu memberi kami SQL yang tidak valid, jadi kami mendapat kesalahan.
Baris mulai old
dan new
tunjukkan baris yang kita masukkan sebelum dan sesudah SQL*Plus menerapkan variabel substitusi. new
baris adalah baris yang coba dijalankan oleh database.
Anda dapat mengaktifkan atau menonaktifkan tampilan old
dan new
baris menggunakan SET VERIFY ON
dan SET VERIFY OFF
. Anda juga dapat mengaktifkan atau menonaktifkan penggantian variabel substitusi dengan menggunakan SET DEFINE ON
dan SET DEFINE OFF
.
Jika kita ingin menjalankan query di atas menggunakan variabel substitusi, kita harus memberi tanda kutip di sekitarnya:
SQL> select * from dual where dummy = '&subvar'; old 1: select * from dual where dummy = '&subvar' new 1: select * from dual where dummy = 'X' D - X
Jika &subvar
kebetulan berisi string yang merupakan angka yang valid (mis. 5
), maka kita bisa lolos tanpa menggunakan tanda kutip, tapi itu hanya karena mengeluarkan teks &subvar
dan menggantinya dengan teks 5
kebetulan memberi kami SQL yang valid.
Misalnya, kita memiliki tabel bernama test
dengan data berikut di dalamnya:
A ---------- 1 2 3 4 5
Kemudian kita bisa melakukannya
SQL> define subvar=5 SQL> select * from test where a = &subvar; old 1: select * from test where a = &subvar new 1: select * from test where a = 5 A ---------- 5
Variabel pengikat, di sisi lain, memiliki tipe. Itu bukan nilai teks sederhana. Nilainya dikirim ke database, dan database juga dapat mengatur nilainya.
SQL> variable bindvar varchar2(1); SQL> exec :bindvar := 'X'; PL/SQL procedure successfully completed.
Anda tidak menempatkan tanda kutip di sekitar variabel bind saat Anda ingin menggunakannya:
SQL> select * from dual where dummy = :bindvar; D - X SQL> select * from dual where dummy = ':bindvar'; no rows selected
Pada contoh kedua di atas, kami tidak mendapatkan baris yang dikembalikan karena DUAL
tabel tidak memiliki baris dengan DUMMY
kolom yang berisi teks :bindvar
.
Anda akan mendapatkan kesalahan jika mencoba menetapkan nilai dengan tipe yang salah ke variabel bind:
SQL> variable bindvar number; SQL> exec :bindvar := 'X'; BEGIN :bindvar := 'X'; END; * ERROR at line 1: ORA-06502: PL/SQL: numeric or value error: character to number conversion error ORA-06512: at line 1
Variabel ikat adalah bagian standar dari database, dan Anda dapat menggunakannya dengan JDBC atau metode koneksi mana pun ke database yang Anda pilih.
Terakhir, variable num1 number
dan var num1 number
keduanya memiliki arti yang sama. Keduanya mendefinisikan variabel pengikat num1
bertipe number
. var
hanyalah singkatan dari variable
.