2011-06-17 10 views
14

के लिए सभी कॉलम सभी कॉलम खोजें सभी टेबल और कॉलम में स्ट्रिंग के लिए मुझे अपने ऑरैक डेटाबेस को खोजना होगा। मैं नीचे दिए गए क्वेरी मैं ऑनलाइन पाया है, लेकिन जब मैं इसे अमल मैं निम्न त्रुटिओरेकल स्ट्रिंग

किसी भी मदद की सराहना की

ORA-06550: line 6, column 31: 
PL/SQL: ORA-00904: "COLUMN_NAME": invalid identifier 
ORA-06550: line 6, column 12: 
PL/SQL: SQL Statement ignored 
ORA-06550: line 8, column 30: 
PLS-00364: loop index variable 'T' use is invalid 
ORA-06550: line 7, column 4: 
PL/SQL: Statement ignored 
ORA-06550: line 12, column 38: 
PLS-00364: loop index variable 'T' use is invalid 
ORA-06550: line 12, column 16: 
PL/SQL: Statement ignored 

BEGIN 
    FOR t IN (SELECT table_name, column_name FROM all_tables) LOOP 
    EXECUTE IMMEDIATE  
    'SELECT COUNT(*) FROM '||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.table_name ||' '||t.column_name||' '||match_count); 
      END IF; 
    END LOOP; 
END; 
/
+1

आप कुछ तरीकों से grep का उपयोग करके डेटाबेस फ़ाइलों को क्यों नहीं खोजते? कम से कम तब आप फ़ाइल/ब्लॉक ऑफसेट प्राप्त कर सकते हैं, और प्रश्न में तालिकाओं को ढूंढ सकते हैं। –

उत्तर

30

कम से कम मिलता है, आप, 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; 
/

बेशक तरह, इस पागलपन की हद तक होने जा रहा है slow-- आप पूर्ण तालिका में हर स्ट्रिंग स्तंभ के लिए एक बार हर तालिका स्कैन था संदेह है। मामूली बड़ी टेबल और स्ट्रिंग कॉलम की एक मध्यम संख्या के साथ, इसमें काफी समय लग सकता है।

+0

क्वेरी के माध्यम से काम करता है यही कारण है, एक सा यह मेरे ORA-00942 के नीचे त्रुटि देता है: तालिका या दृश्य मौजूद नहीं है ORA-06512: लाइन 12 पर कैसे कर सकते हैं मैं इसे फिर से शुरू या इस त्रुटि – Jim

+0

उपेक्षा @Jim है - मैंने अपने दूसरे समाधान में एक अपवाद हैंडलर जोड़ा। यदि आपके स्कीमा के बाहर टेबल तक पहुंच है तो मैंने स्कीमा स्वामी क्वालीफायर भी जोड़ा है। –

+0

मुझे v_search_string और match_count घोषित करना था, और यह काम प्राप्त करने के लिए निहित कर्सर में SELECT में स्वामी फ़ील्ड जोड़ें। यह वास्तविक मणि +1 है। – Blanthor