Улучшил процедуру 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%');