Найдите столбец и значение из схемы, просканируйте всю таблицу в oracle - PullRequest
1 голос
/ 07 мая 2020

Я пытаюсь найти столбец (ABC) и его значение 1234 из схемы, в основном мне нужно проверить, AB C и значение из этого столбца 1234 присутствует в любой другой таблице, которая сопоставлена ​​с AB C, я попытался выполнить поиск наиболее эффективным способом, но это занимает много времени и не получает желаемый результат

Я пробовал https://lalitkumarb.wordpress.com/2015/01/06/sql-to-search-for-a-value-in-all-columns-of-all-atbles-in-an-entire-schema/

, но запрос вообще не дает результатов, он выполняется ...

1 Ответ

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

Вы можете записать вывод в файл, если вы получаете переполнение буфера на set Serveroutput, в противном случае это должно быть. На выходе будут все таблицы со столбцом 'ABC', а соответствующий счетчик показывает количество записей со значением столбца ABC как 1234.

SET SERVEROUTPUT ON 100000
DECLARE 
lv_count number(10):=0;
l_str    varchar2 (1000);
BEGIN 
FOR V1 IN 
(select distinct table_name 
 from dba_tab_columns 
 where column_name = 'ABC')

 LOOP

  BEGIN 
    lv_query := ' select count(*) from '||v1.table_name||' where ABC =1234';
    EXECUTE IMMEDIATE lv_query INTO lv_count;
    dbms_output.put_line(v1.table_name||' --> '||lv_count);

    EXCEPTION 
       WHEN OTHERS THEN 
         dbms_output.put_line('OTHERS EXCEPTION '||v1.table_name||' ERRCODE '||SQLERRM||' '||SUBSTR(SQLCODE,1,200));
    END; 

 END LOOP;

END;

Чтобы найти все таблицы с именем column_name AB C, следует выполнить простой запрос, как показано ниже.

select table_name 
     from dba_tab_columns 
     where column_name = UPPER('ABC');

PS: Таблицы метаданных (dba_Tab_columns) хранят имя_столбца в верхний регистр, чтобы избежать проблем с регистром, преобразование регистра в верхний для литерала.

Второй запрос в блоке PL / SQL,

 SET SERVEROUTPUT ON 100000
    DECLARE 
    lv_count number(10):=0;
    l_str    varchar2 (1000);
    lv_col_name varchar2(255) :='ABC';

    BEGIN 
    FOR V1 IN 
    (select distinct table_name 
     from dba_tab_columns 
     where column_name = lv_col_name)

     LOOP
      dbms_output.put_line(lv_col_name||' '||v1.table_name);    
     END LOOP;

    END;
...