Problemet beror på om du använder char
eller varchar2
jämförelsesemantik i dina frågor. Om du har en hårdkodad sträng literal eller en char(10)
variabel, Oracle använder char
jämförelsesemantik som ska ignorera det efterföljande vita utrymmet. Om du har en varchar2(10)
variabel, Oracle använder varchar2
jämförelsesemantik som inkluderar det efterföljande vita utrymmet. Alltså
select aa
into v_temp
from abc
where aa in (v_aa);
returnerar en rad om v_aa
definieras som en char(10)
(eller om den ersätts med en bokstavlig sträng) men inte om den är definierad som en varchar(10)
.
Detta är en av (många) anledningarna till att de flesta undviker char
datatyper helt och hållet. Personligen har jag inget emot en och annan char
för data med verkligt fast bredd (dvs. char(1)
för flaggor och char(2)
för tillståndskoder) även om det inte finns någon fördel med att använda char
över varchar2
i de scenarierna. För allt som inte är fast bredd, dock med en char
är meningslöst. Du tvingar bara Oracle att konsumera mer utrymme än det behöver och skapar mer arbete för dig själv genom att hantera två uppsättningar av strängjämförelsesemantik (bland andra frågor).