Jednym z powodów niepowodzenia konwersji niejawnych jest to, że łącząca kolumna varchar zawiera dane, które nie są liczbowe. Oracle obsługuje liczbę do złączeń varchar2 poprzez konwersję ciągów (sprawdź cytat Gary'ego w jego komentarzu), więc faktycznie wykonuje to:
select a.col1, b.somecol
from tableA a inner join tableB b on to_number(b.col2)=a.col1;
Jeśli tabelaB.col2 zawiera wartości, które nie są numeryczne - wydaje się całkiem prawdopodobne, w końcu jest to ciąg - wtedy wyświetli ORA-01722: invalid number
. Poprzez jawne rzutowanie kolumny liczbowej na ciąg znaków skracasz domyślne zachowanie Oracle.
To, że nie masz tego problemu w pierwszych dwóch środowiskach, jest kwestią szczęścia, a nie konfiguracji. Może wystąpić w dowolnym momencie, ponieważ wymaga tylko jednego nienumerycznego ciągu do przerwania zapytania. Więc naprawdę powinieneś uruchomić z jawną konwersją we wszystkich środowiskach.
Jeśli chodzi o wydajność, możesz zbudować indeks oparty na funkcjach ...
create index whatever_idx on tableA ( to_char(col1) )
/