Искать во всех таблицах значение (Oracle) - PullRequest
0 голосов
/ 06 мая 2020

Можно ли сканировать каждую таблицу в схеме для определенного значения в Oracle? , небольшое изменение в logi c, мне нужно выполнить поиск в определенном столбце c (SAMPLE_AB C) в схеме, чтобы я мог продолжить исследование, в каких таблицах используется этот столбец SAMPLE_AB C, поэтому что я могу найти желаемый результат

в основном я ищу числовой пример имя_столбца - значение-12345

Я пробовал следующее, но он работает очень долго ... .., я попытался найти варианты, но мне не удалось

SET SERVEROUTPUT ON SIZE 100000

    DECLARE
      match_count INTEGER;
    BEGIN
      FOR t IN (SELECT owner, table_name, column_name
                  FROM all_tab_columns
                  WHERE owner <> 'SYS' and data_type LIKE '%CHAR%') LOOP

        EXECUTE IMMEDIATE
          'SELECT COUNT(*) FROM ' || t.owner || '.' || t.table_name ||
          ' WHERE '||t.column_name||' = :1'
          INTO match_count
          USING '12345';

        IF match_count > 0 THEN
          dbms_output.put_line( t.table_name ||' '||t.column_name||' '||match_count );
        END IF;

      END LOOP;

    END;
    /

1 Ответ

0 голосов
/ 07 мая 2020

Если вы не хотите подсчитывать появления строки поиска, EXISTS может быть лучшим вариантом, поскольку он прекратит поиск по таблице, как только обнаружит первое появление. Итак, я бы предложил что-то вроде этого; посмотрим, поможет ли это.

SQL> declare
  2     match_count    integer;
  3     search_string  varchar2 (20) := 'MANAGER';
  4     l_str          varchar2 (1000);
  5  begin
  6     for t in (select owner, table_name, column_name
  7                 from all_tab_columns
  8                where     owner <> 'SYS'
  9                      and owner in ('SCOTT', 'MIKE')
 10                      and data_type like '%CHAR%')
 11     loop
 12        l_str :=
 13              'SELECT MAX(1) FROM '
 14           || t.owner
 15           || '.'
 16           || t.table_name
 17           || ' a'
 18           || '  WHERE EXISTS (SELECT NULL FROM '
 19           || t.owner
 20           || '.'
 21           || t.table_name
 22           || ' b'
 23           || '                WHERE b.'
 24           || t.column_name
 25           || ' = a.'
 26           || t.column_name
 27           || '                AND b.'
 28           || t.column_name
 29           || ' = :1'
 30           || ')';
 31
 32        execute immediate l_str into match_count using search_string;
 33
 34        if match_count > 0
 35        then
 36           dbms_output.put_line (
 37              t.table_name || '.' || t.column_name || ' contains "' || search_string || '"');
 38        end if;
 39     end loop;
 40  end;
 41  /
EMP.JOB contains "MANAGER"

PL/SQL procedure successfully completed.

SQL>
...