Minimal, Anda perlu menanyakan ALL_TAB_COLUMNS, bukan 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;
/
Namun, jika Anda mencari string, Anda hampir pasti ingin membatasi diri untuk mencari kolom yang dapat menyimpan string. Tidak masuk akal, misalnya, untuk mencari string di kolom DATE. Dan kecuali jika Anda memiliki banyak pengetahuan apriori tentang apa isi kolom BLOB dan kemampuan untuk mengurai format biner kolom BLOB, tidak masuk akal untuk mencari kolom BLOB untuk string. Mengingat itu, saya curiga Anda menginginkan sesuatu yang lebih seperti
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;
/
Tentu saja, ini akan menjadi sangat lambat-- Anda akan memindai penuh setiap tabel sekali untuk setiap kolom string dalam tabel. Dengan tabel yang cukup besar dan jumlah kolom string yang moderat, hal itu mungkin akan memakan waktu cukup lama.