Masalahnya adalah apakah Anda menggunakan char atau varchar2 perbandingan semantik dalam kueri Anda. Jika Anda memiliki string literal hard-coded atau char(10) variabel, Oracle menggunakan char perbandingan semantik yang mengabaikan spasi putih. Jika Anda memiliki varchar2(10) variabel, Oracle menggunakan varchar2 perbandingan semantik yang mencakup spasi tambahan. Jadi
select aa
into v_temp
from abc
where aa in (v_aa);
akan mengembalikan baris jika v_aa didefinisikan sebagai char(10) (atau jika diganti dengan string literal) tetapi tidak jika didefinisikan sebagai varchar(10) .
Ini adalah salah satu (banyak) alasan mengapa kebanyakan orang menghindari char tipe data sepenuhnya. Secara pribadi, saya tidak keberatan dengan char untuk data dengan lebar yang benar-benar tetap (yaitu char(1) untuk flag dan char(2) untuk kode negara) meskipun tidak ada gunanya menggunakan char lebih dari varchar2 dalam skenario tersebut. Namun, untuk apa pun yang tidak memiliki lebar tetap, gunakan char tidak masuk akal. Anda hanya memaksa Oracle untuk menggunakan lebih banyak ruang daripada yang dibutuhkan dan menciptakan lebih banyak pekerjaan untuk Anda sendiri yang berurusan dengan dua set semantik perbandingan string (di antara masalah lainnya).