CURSOR_SHARING
ON CONVERSION ERROR
जब पैरामीटर CURSOR_SHARING को FORCE पर सेट किया जाता है तो सुविधा काम नहीं करती है। इस त्रुटि से बचने के लिए, सिस्टम, सत्र, या कथन स्तर पर पैरामीटर बदलें।
आदर्श रूप से, CURSOR_SHARING को संपूर्ण सिस्टम के लिए EXACT पर सेट किया जाना चाहिए। लेकिन अगर हमारे पास ऐसा एप्लिकेशन है जो बाइंड वेरिएबल्स का उपयोग नहीं करता है, तो हम शायद alter system set cursor_sharing=exact;
नहीं चला सकते हैं। ।
पैरामीटर को सत्र स्तर पर सेट किया जा सकता है alter session set cursor_sharing=exact;
, लेकिन सत्र मापदंडों को लगातार बदलना हमेशा सुविधाजनक नहीं होता है।
पैरामीटर को स्टेटमेंट स्तर पर CURSOR_SHARING_EXACT
संकेत के साथ बदला जा सकता है :
SQL> select /*+ cursor_sharing_exact */ to_date(the_date default null on conversion error, 'MM/DD/YYYY') the_date
2 from
3 (
4 select '1/1/2021' the_date from dual union all
5 select 'bad date' the_date from dual
6 );
THE_DATE
---------
01-JAN-21
पार्सर/ऑप्टिमाइज़र बग
जैसा कि @gouessej ने खोजा, ORA-43918 त्रुटि का एक और संभावित कारण है जो कर्सर साझाकरण से संबंधित नहीं है। CASE
. को बदलने से संबंधित पार्सिंग या ऑप्टिमाइज़र बग प्रतीत होते हैं और TO_
Oracle के कुछ संस्करणों पर कार्य करता है।
उदाहरण के लिए, नीचे दिया गया SQL कथन Oracle 18c और 19c पर विफल रहता है:
SQL> select case when v_num is null then 0 else v_num end
2 from
3 (
4 select to_number('120.3' default null on conversion error, '99999D99') as v_num
5 from dual
6 );
select to_number('120.3' default null on conversion error, '99999D99') as v_num
*
ERROR at line 4:
ORA-43918: This argument must be a literal
मेरा मानना है कि यह एक पार्सिंग या ऑप्टिमाइज़र बग है क्योंकि त्रुटि दूर हो जाती है यदि आप rownum >= 1
जैसे विधेय को जोड़कर परिवर्तन को रोकते हैं . (जब Oracle ROWNUM
. देखता है , यह मानता है कि परिणाम एक निश्चित क्रम में प्रदर्शित होने चाहिए और उस क्वेरी ब्लॉक में उतने रूपांतरण लागू नहीं होंगे।)
SQL> select case when v_num is null then 0 else v_num end
2 from
3 (
4 select to_number('120.3' default null on conversion error, '99999D99') as v_num
5 from dual
6 where rownum >= 1
7 );
CASEWHENV_NUMISNULLTHEN0ELSEV_NUMEND
------------------------------------
120.3