Проблемът се свежда до това дали използвате char или varchar2 сравнителна семантика във вашите заявки. Ако имате твърдо кодиран низов литерал или char(10) променлива, Oracle използва char сравнителна семантика, която трябва да игнорира празното пространство в края. Ако имате varchar2(10) променлива, Oracle използва varchar2 сравнителна семантика, която включва празното пространство в края. Така
select aa
into v_temp
from abc
where aa in (v_aa);
ще върне ред, ако v_aa се дефинира като char(10) (или ако е заменен с низов литерал), но не и ако е дефиниран като varchar(10) .
Това е една от (многото) причини повечето хора да избягват char типове данни изцяло. Лично аз нямам нищо против случайния char за данни с наистина фиксирана ширина (т.е. char(1) за флагове и char(2) за кодове на състояние), въпреки че няма полза от използването на char над varchar2 в тези сценарии. За всичко, което не е с фиксирана ширина обаче, използвайте char няма смисъл. Вие просто принуждавате Oracle да заема повече място от необходимото и създавате повече работа за себе си, като се занимавате с два набора семантика за сравнение на низове (наред с други проблеми).