कम से कम, आपको 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;
/
बेशक, यह बेहद धीमी गति से होने वाला है-- आप तालिका में प्रत्येक स्ट्रिंग कॉलम के लिए प्रत्येक तालिका को एक बार पूर्ण स्कैन करेंगे। मध्यम रूप से बड़ी तालिकाओं और मध्यम संख्या में स्ट्रिंग स्तंभों के साथ, इसमें काफी समय लगने की संभावना है।