Problem sprowadza się do tego, czy używasz char lub varchar2 semantyka porównawcza w zapytaniach. Jeśli masz zakodowany na stałe literał ciągu lub char(10) zmienna Oracle używa char semantyki porównania, które mają ignorować końcowe białe znaki. Jeśli masz varchar2(10) zmienna Oracle używa varchar2 semantyka porównania, która obejmuje końcowe białe znaki. Tak więc
select aa
into v_temp
from abc
where aa in (v_aa);
zwróci wiersz, jeśli v_aa jest zdefiniowany jako char(10) (lub jeśli jest zastąpiony literałem ciągu), ale nie, jeśli jest zdefiniowany jako varchar(10) .
Jest to jeden z (wielu) powodów, dla których większość ludzi unika char typy danych całkowicie. Osobiście nie przeszkadza mi okazjonalny char dla danych o naprawdę stałej szerokości (np. char(1) dla flag i char(2) dla kodów stanów), nawet jeśli nie ma żadnych korzyści z używania char ponad varchar2 w tych scenariuszach. Jednak dla wszystkiego, co nie ma stałej szerokości, użyj char nie ma sensu. Po prostu zmuszasz Oracle do zajmowania większej ilości miejsca niż to konieczne i tworzenia większej ilości pracy dla siebie, radzenia sobie z dwoma zestawami semantyki porównywania ciągów (między innymi problemami).