среда, 7 июня 2017 г.

Search values in all columns of all tables

Улучшил процедуру whereIsValue из статьи  SQL: Поиск значения по всем колонкам всех таблиц:

  • Добавил параметр schemaName для поиска в конкретной схеме
  • Заменил user_ views на all_ чтобы была возможность поиска по любой схеме
  • Обернул в кавычки "' || columnName || '" так как столкнулся с ситуацией когда колонка называлась зарезервированным словом "DATE" 
  1. create or replace procedure whereIsValue(p_schemaName varchar2, p_searchValue varchar2)
  2. AS
  3. TYPE VALCUR IS REF CURSOR;
  4. cursor tabl(c_schemaName varchar2) is select table_name from all_tables where owner = c_schemaName order by table_name;
  5. 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;
  6. valueCursor VALCUR;
  7. tableName varchar2(50);
  8. columnName varchar2(50);
  9. columnValue varchar2(500);
  10. begin
  11. open tabl(p_schemaName);
  12. LOOP
  13. fetch tabl into tableName;
  14. EXIT WHEN tabl%NOTFOUND;
  15. --dbms_output.put_line('Search in table - ' || tableName);
  16. OPEN col(p_schemaName, tableName);
  17. LOOP
  18. fetch col into columnName;
  19. EXIT WHEN col%NOTFOUND;
  20. --dbms_output.put_line('Search in column - ' || columnName);
  21. OPEN valueCursor for 'select "' || columnName || '" from ' || p_schemaName || '."' || tableName || '"';
  22. LOOP
  23. BEGIN
  24. fetch valueCursor into columnValue;
  25. EXIT WHEN valueCursor%NOTFOUND;
  26. if (columnValue like p_searchValue) then
  27. dbms_output.put_line('Found in table - ' || tableName || ' and column - ' || columnName);
  28. exit;
  29. end if;
  30. EXCEPTION
  31. WHEN OTHERS then
  32. NULL;
  33. END;
  34. END LOOP;
  35. CLOSE valueCursor;
  36. END LOOP;
  37. CLOSE col;
  38. END LOOP;
  39. end;
  40. /
Примеры вызова:
  1. sqlplus /nolog
  2. conn system
  3.  
  4. SET SERVEROUTPUT ON
  5.  
  6. exec whereIsValue('SCOTT', '1496765408852');
  7. exec whereIsValue('SCOTT', 'CLERK');
  8. exec whereIsValue('SCOTT', '%JONES%');