Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

रूपांतरण त्रुटि पर ORA-43918 के साथ विफल रहता है:यह तर्क एक शाब्दिक होना चाहिए

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ओरा:12505:टीएनएस:श्रोता को वर्तमान में कनेक्ट डिस्क्रिप्टर में दिए गए एसआईडी के बारे में पता नहीं है (डीबीडी त्रुटि:ओसीआईएससेवर अटैच)

  2. oracle 11g के माध्यम से एसएमएस कैसे भेजें? क्लाइंट टॉड है और भारत में मुझे एसएमएस भेजना है

  3. ऑटो जनरेटिंग रिस्पांस फाइल

  4. java.sql.SQLException:समाप्त परिणामसेट

  5. मैं Oracle में दो CLOB मानों की तुलना कैसे करूं?