Một lý do tại sao chuyển đổi ngầm định không thành công là khi cột varchar tham gia chứa dữ liệu không phải là số. Oracle xử lý số để tham gia varchar2 bằng cách chuyển đổi các chuỗi (xem trích dẫn của Gary trong nhận xét của anh ấy), vì vậy nó thực sự thực thi điều này:
select a.col1, b.somecol
from tableA a inner join tableB b on to_number(b.col2)=a.col1;
Nếu tableB.col2 chứa các giá trị không phải là số - có vẻ như rất có thể, đó là một chuỗi - sau đó nó sẽ vượt qua ORA-01722: invalid number
. Bằng cách truyền một cách rõ ràng cột số thành một chuỗi, bạn làm ngắn mạch hành vi mặc định của Oracle.
Thực tế là bạn không gặp vấn đề này trong hai môi trường đầu tiên của bạn là một vấn đề may mắn không phải là cấu hình. Nó có thể xảy ra bất cứ lúc nào vì nó chỉ yêu cầu một chuỗi không phải số để ngắt truy vấn. Vì vậy, thực sự bạn nên chạy với chuyển đổi rõ ràng trong tất cả các môi trường.
Đối với hiệu suất, bạn có thể tạo chỉ mục dựa trên chức năng ...
create index whatever_idx on tableA ( to_char(col1) )
/