SET SERVEROUTPUT ON
DECLARE
-- список слов для поиска
TYPE t_words IS TABLE OF VARCHAR2(100);
v_words t_words := t_words('apple', 'orange', 'banana');
v_sql VARCHAR2(4000);
v_count NUMBER;
BEGIN
FOR rec IN (
SELECT owner, table_name, column_name
FROM all_tab_columns
WHERE data_type IN ('VARCHAR2', 'CHAR', 'NVARCHAR2', 'NCHAR', 'CLOB', 'NCLOB')
AND owner NOT IN ('SYS', 'SYSTEM')
) LOOP
-- формируем условие поиска по списку слов
v_sql := 'SELECT COUNT(*) FROM (SELECT ' || rec.column_name ||
' FROM ' || rec.owner || '.' || rec.table_name ||
' WHERE ROWNUM <= 100) WHERE ';
FOR i IN 1 .. v_words.COUNT LOOP
IF i > 1 THEN
v_sql := v_sql || ' OR ';
END IF;
v_sql := v_sql || rec.column_name || ' LIKE ''%' || v_words(i) || '%''';
END LOOP;
-- выполнить запрос и вывести результат, если найдено совпадение
EXECUTE IMMEDIATE v_sql INTO v_count;
IF v_count > 0 THEN
DBMS_OUTPUT.PUT_LINE(rec.owner || '.' || rec.table_name || '.' || rec.column_name || ' (' || v_count || ')');
END IF;
END LOOP;
END;
/