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

ओरेकल स्ट्रिंग के लिए सभी टेबल सभी कॉलम खोजें

कम से कम, आपको ALL_TAB_COLUMNS से ​​पूछताछ करनी होगी, ALL_TABLES की नहीं

DECLARE
  match_count integer;
  v_search_string varchar2(4000) := <<string you want to search for>>;
BEGIN  
  FOR t IN (SELECT owner, table_name, column_name FROM all_tab_columns) LOOP   
    EXECUTE IMMEDIATE    
      'SELECT COUNT(*) FROM '||t.owner || '.' || t.table_name||
      ' WHERE '||t.column_name||' = :1'   
       INTO match_count  
      USING v_search_string; 
    IF match_count > 0 THEN 
      dbms_output.put_line( t.owner || '.' || t.table_name ||' '||t.column_name||' '||match_count );
    END IF; 
  END LOOP;
END;
/

हालांकि, यदि आप एक स्ट्रिंग की तलाश कर रहे हैं, तो आप निश्चित रूप से अपने आप को उन स्तंभों की तलाश तक सीमित रखना चाहेंगे जो एक स्ट्रिंग को संग्रहीत कर सकते हैं। उदाहरण के लिए, स्ट्रिंग के लिए DATE कॉलम खोजने का कोई मतलब नहीं होगा। और जब तक आपके पास बीएलओबी कॉलम में क्या है और बीएलओबी कॉलम के बाइनरी स्वरूपण को पार्स करने की क्षमता के बारे में प्राथमिक ज्ञान का एक बड़ा सौदा नहीं है, तो स्ट्रिंग के लिए बीएलओबी कॉलम खोजने का कोई मतलब नहीं होगा। यह देखते हुए, मुझे संदेह है कि आप कुछ और पसंद करना चाहते हैं

DECLARE
  match_count integer;
  v_search_string varchar2(4000) := <<string you want to search for>>;
BEGIN  
  FOR t IN (SELECT owner,
                   table_name, 
                   column_name 
              FROM all_tab_columns
             WHERE data_type in ('CHAR', 'VARCHAR2', 'NCHAR', 'NVARCHAR2', 
                                 'CLOB', 'NCLOB') ) 
  LOOP   
    BEGIN
      EXECUTE IMMEDIATE    
        'SELECT COUNT(*) FROM '||t.owner || '.' || t.table_name||
        ' WHERE '||t.column_name||' = :1'   
         INTO match_count  
        USING v_search_string; 
      IF match_count > 0 THEN 
        dbms_output.put_line( t.owner || '.' || t.table_name ||' '||t.column_name||' '||match_count );
      END IF; 
    EXCEPTION
      WHEN others THEN
        dbms_output.put_line( 'Error encountered trying to read ' ||
                              t.column_name || ' from ' || 
                              t.owner || '.' || t.table_name );
    END;
  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. ओरेकल पीएल/एसक्यूएल में सीएसवी फाइलों को कुशलतापूर्वक पढ़ें और आयात करें

  4. R12.2 ऑनलाइन पैचिंग तैयारी रिपोर्ट

  5. क्या सत्र को मारे बिना ऑरैकल में एक प्रश्न को मारना संभव है?