Проблемът се свежда до това дали използвате 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 да заема повече място от необходимото и създавате повече работа за себе си, като се занимавате с два набора семантика за сравнение на низове (наред с други проблеми).