Улучшил процедуру whereIsValue из статьи SQL: Поиск значения по всем колонкам всех таблиц:
- Добавил параметр schemaName для поиска в конкретной схеме
- Заменил user_ views на all_ чтобы была возможность поиска по любой схеме
- Обернул в кавычки "' || columnName || '" так как столкнулся с ситуацией когда колонка называлась зарезервированным словом "DATE"
create or replace procedure whereIsValue(p_schemaName varchar2, p_searchValue varchar2) AS TYPE VALCUR IS REF CURSOR; cursor tabl(c_schemaName varchar2) is select table_name from all_tables where owner = c_schemaName order by table_name; cursor col (c_schemaName varchar2, c_tablename varchar2) is select column_name from all_tab_columns where owner = c_schemaName and table_name like c_tableName; valueCursor VALCUR; tableName varchar2(50); columnName varchar2(50); columnValue varchar2(500); begin open tabl(p_schemaName); LOOP fetch tabl into tableName; EXIT WHEN tabl%NOTFOUND; --dbms_output.put_line('Search in table - ' || tableName); OPEN col(p_schemaName, tableName); LOOP fetch col into columnName; EXIT WHEN col%NOTFOUND; --dbms_output.put_line('Search in column - ' || columnName); OPEN valueCursor for 'select "' || columnName || '" from ' || p_schemaName || '."' || tableName || '"'; LOOP BEGIN fetch valueCursor into columnValue; EXIT WHEN valueCursor%NOTFOUND; if (columnValue like p_searchValue) then dbms_output.put_line('Found in table - ' || tableName || ' and column - ' || columnName); exit; end if; EXCEPTION WHEN OTHERS then NULL; END; END LOOP; CLOSE valueCursor; END LOOP; CLOSE col; END LOOP; end; /Примеры вызова:
sqlplus /nolog conn system SET SERVEROUTPUT ON exec whereIsValue('SCOTT', '1496765408852'); exec whereIsValue('SCOTT', 'CLERK'); exec whereIsValue('SCOTT', '%JONES%');