Problém spočívá v tom, zda používáte char
nebo varchar2
srovnání sémantiky ve vašich dotazech. Pokud máte pevně zakódovaný řetězcový literál nebo char(10)
Oracle používá proměnnou char
sémantika porovnání, která má ignorovat koncové prázdné místo. Pokud máte varchar2(10)
Oracle používá proměnnou varchar2
sémantika porovnání, která zahrnuje koncové prázdné místo. Tedy
select aa
into v_temp
from abc
where aa in (v_aa);
vrátí řádek, pokud v_aa
je definován jako char(10)
(nebo pokud je nahrazen řetězcovým literálem), ale ne, pokud je definován jako varchar(10)
.
Toto je jeden z (mnoha) důvodů, proč se většina lidí vyhýbá char
datové typy úplně. Osobně mi občasné char
nevadí pro data skutečně s pevnou šířkou (tj. char(1)
pro příznaky a char(2)
pro stavové kódy), i když použití char
nemá žádnou výhodu přes varchar2
v těch scénářích. Pro vše, co nemá pevnou šířku, však pomocí char
nedává to smysl. Jen nutíte Oracle, aby spotřeboval více místa, než potřebuje, a vytváříte pro sebe více práce se dvěma sadami sémantiky porovnávání řetězců (mimo jiné).