अंतर्निहित रूपांतरण विफल होने का एक कारण यह है कि जब वर्चर कॉलम में शामिल होने वाला डेटा होता है जो संख्यात्मक नहीं होता है। Oracle स्ट्रिंग्स को परिवर्तित करके संख्या को varchar2 जॉइन करता है (गैरी के उद्धरण को उसकी टिप्पणी में देखें), इसलिए यह वास्तव में इसे निष्पादित करता है:
select a.col1, b.somecol
from tableA a inner join tableB b on to_number(b.col2)=a.col1;
यदि tableB.col2 में वे मान हैं जो संख्यात्मक नहीं हैं - काफी संभावना है, यह एक स्ट्रिंग है - तो यह ORA-01722: invalid number
को नुकसान पहुंचाएगा . संख्या कॉलम को एक स्ट्रिंग में स्पष्ट रूप से कास्ट करके आप ओरेकल के डिफ़ॉल्ट व्यवहार को शॉर्ट-सर्किट करते हैं।
तथ्य यह है कि आपको अपने पहले दो वातावरणों में यह समस्या नहीं मिलती है, यह किस्मत की बात है न कि कॉन्फ़िगरेशन की। यह किसी भी समय हड़ताल कर सकता है, क्योंकि क्वेरी को तोड़ने के लिए इसे केवल एक गैर-संख्यात्मक स्ट्रिंग की आवश्यकता होती है। तो वास्तव में आपको सभी वातावरणों में स्पष्ट रूपांतरण के साथ चलना चाहिए।
प्रदर्शन के लिए, आप एक फ़ंक्शन-आधारित अनुक्रमणिका बना सकते हैं ...
create index whatever_idx on tableA ( to_char(col1) )
/