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 .