Search Text in whole DB (Oracle)

Share this post

Create this procedure in ADMIN user

CREATE OR REPLACE PROCEDURE SEARCH_TEXT_IN_SCHEMAS (
    p_owner_like IN VARCHAR2,   -- e.g. 'STAR%' or 'APP%'
    p_text       IN VARCHAR2    -- e.g. 'SK1'
)
AS
    v_sql       VARCHAR2(4000);
    v_cursor    SYS_REFCURSOR;
    v_table     VARCHAR2(200);
    v_column    VARCHAR2(200);
    v_value     VARCHAR2(4000);
BEGIN
    DBMS_OUTPUT.PUT_LINE('Searching for "' || p_text || '" in owners like "' || p_owner_like || '"');
    DBMS_OUTPUT.PUT_LINE('---------------------------------------------------------------');

    FOR owner_rec IN (
        SELECT DISTINCT owner
        FROM all_tab_columns
        WHERE owner LIKE UPPER(p_owner_like)
          AND data_type IN ('VARCHAR2', 'CHAR', 'NVARCHAR2', 'NCHAR')
        ORDER BY owner
    )
    LOOP
        DBMS_OUTPUT.PUT_LINE('=== Checking Schema: ' || owner_rec.owner || ' ===');

        FOR rec IN (
            SELECT table_name, column_name
            FROM all_tab_columns
            WHERE owner = owner_rec.owner
              AND data_type IN ('VARCHAR2', 'CHAR', 'NVARCHAR2', 'NCHAR')
            ORDER BY table_name, column_name
        )
        LOOP
            v_sql := 'SELECT ''' || rec.table_name || ''' AS table_name, ' ||
                     '''' || rec.column_name || ''' AS column_name, ' ||
                     rec.column_name || ' AS match_value ' ||
                     'FROM "' || owner_rec.owner || '"."' || rec.table_name || '" ' ||
                     'WHERE LOWER(' || rec.column_name || ') LIKE :1';

            BEGIN
                OPEN v_cursor FOR v_sql USING '%' || LOWER(p_text) || '%';
                LOOP
                    FETCH v_cursor INTO v_table, v_column, v_value;
                    EXIT WHEN v_cursor%NOTFOUND;
                    DBMS_OUTPUT.PUT_LINE(
                        'OWNER: ' || owner_rec.owner ||
                        ' | TABLE: ' || v_table ||
                        ' | COLUMN: ' || v_column ||
                        ' | VALUE: ' || SUBSTR(v_value, 1, 200)
                    );
                END LOOP;
                CLOSE v_cursor;
            EXCEPTION
                WHEN OTHERS THEN
                    IF v_cursor%ISOPEN THEN
                        CLOSE v_cursor;
                    END IF;
                    -- Skip inaccessible tables or data conversion issues
                    NULL;
            END;
        END LOOP;
    END LOOP;
END;
/

Run this below in ADMIN user

SET SERVEROUTPUT ON SIZE UNLIMITED;
EXEC SEARCH_TEXT_IN_SCHEMAS('Search_in_Schema_like%', 'text_to_search');

Share this post

Leave a Reply

Your email address will not be published. Required fields are marked *