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