Jedním z důvodů, proč implicitní převody selžou, je, když spojovací sloupec varchar obsahuje data, která nejsou číselná. Oracle zpracovává spojení čísla na varchar2 převodem řetězců (podívejte se na Garyho citaci v jeho komentáři), takže ve skutečnosti provede toto:
select a.col1, b.somecol
from tableA a inner join tableB b on to_number(b.col2)=a.col1;
Pokud tabulkaB.col2 obsahuje hodnoty, které nejsou číselné – zdá se to docela pravděpodobné, je to koneckonců řetězec – pak to vrhne ORA-01722: invalid number
. Explicitním přetypováním sloupce s číslem na řetězec zkratujete výchozí chování Oracle.
Skutečnost, že tento problém nenastane ve vašich prvních dvou prostředích, je věcí štěstí, nikoli konfigurace. Může zasáhnout kdykoli, protože k přerušení dotazu vyžaduje pouze jeden nečíselný řetězec. Takže opravdu byste měli běžet s explicitní konverzí ve všech prostředích.
Pokud jde o výkon, můžete vytvořit index založený na funkcích ...
create index whatever_idx on tableA ( to_char(col1) )
/