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

विभिन्न Oracle प्रकार के लिए NULL मान खोज रहे हैं

आप करने के लिए अपना कोड बदल सकते हैं:

   v_lstmt := 'SELECT count(*) FROM userB.tableB WHERE id = '''||v_ret (i).id||''''
     || ' and ('||v_ret (i).col||' is null or '||v_ret (i).col||' = :val)';

   EXECUTE IMMEDIATE v_lstmt INTO cDel using v_ret (i).val;

यह जांचता है कि कॉलम शून्य है या आपूर्ति किए गए val . से मेल खाता है , और पार्सिंग को थोड़ा कम करने के लिए जांच करने के लिए मूल्य की आपूर्ति करने के लिए एक बाइंड वैरिएबल का उपयोग करता है।

हालांकि यह अभी भी निहित रूपांतरण पर निर्भर करता है, इसलिए यदि आपके पास तालिका में दिनांक मान था, उदाहरण के लिए आप लक्ष्य तालिका कॉलम प्रकार से मेल खाने के लिए इसे परिवर्तित करने के लिए अपनी एनएलएस सेटिंग्स पर निर्भर होंगे।

आप all_tab_columns . का उपयोग कर सकते हैं लक्ष्य स्तंभ के डेटा प्रकार को खोजने के लिए देखें और val . का स्पष्ट रूपांतरण करें बाध्यकारी से पहले उस प्रकार के लिए। dbms_sql . का उपयोग करने के लिए एक अधिक शामिल लेकिन संभवतः अधिक मजबूत दृष्टिकोण होगा execute immediate . के बजाय आंतरिक गतिशील SQL के लिए ।

ऐसा लगता है कि बाहरी क्वेरी को गतिशील होने की आवश्यकता नहीं है, हालांकि आप ऐसा कर सकते हैं:

declare
  v_lstmt   VARCHAR2(32000);
  cDel   number;
begin
  for rec in (SELECT id, col, val FROM tableA) loop
    v_lstmt := 'SELECT count(*) FROM tableB WHERE id = '''||rec.id||''''
      || ' and ('||rec.col||' is null or '||rec.col||' = :val)';


    dbms_output.put_line(v_lstmt);
    EXECUTE IMMEDIATE v_lstmt INTO cDel using rec.val;
    If cDel > 0 Then
      --some code
      cDel := 0;   
    end if;
  end loop;
end;
/


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मौजूदा चेक बाधा को कैसे संशोधित करें?

  2. एक प्रक्रिया द्वारा लौटाए गए आरईएफ कर्सर से प्राप्त करें और थोक संग्रह करें

  3. Oracle फॉर्म / फॉर्म 6i में टाइमर बनाना और एक घड़ी प्रदर्शित करना

  4. पैकेज का आरंभीकरण खंड

  5. रहस्यमय SQL मेरी संग्रहीत कार्यविधि को ORACLE पर क्रियान्वित करने से रोक रहा है