powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как "просканировать" таблицы в схеме?
20 сообщений из 20, страница 1 из 1
Как "просканировать" таблицы в схеме?
    #39548591
Фотография Banks Analytics
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть схема со множеством таблиц. Схема эта закрывается 2 раза в сутки на апдейт - в обед и на ночь.
Мне нужно выяснить имя таблиц по искомому значению (например по номеру договора), но в каких таблицах фигурирует данные по этому договору я не знаю.
Есть скрипт, который выводит имя столбца и имя таблицы, но работает долго (много таблиц). На ночь оставить не получится см. 1-я строка выше, а в период с обеда до вечера жалобы от коллеги, что его скрипты начинают долго работать.
Скопировать эти таблицы в "свою" схему, а потом спокойно обрабатывать, не получится, т.к. не хватит дискового пространства.
Вот думаю может как-то кусками схему сканировать? Сначала первые 100 таблиц, потом 101-200 и т.д, но не знаю как это реализовать, чтобы не с первой скан начинался. Что еще можете подсказать друзья?
...
Рейтинг: 0 / 0
Как "просканировать" таблицы в схеме?
    #39548605
Фотография Banks Analytics
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для поиска использую метод с функцией описанный здесь
http://www.cyberforum.ru/post1824587.html
...
Рейтинг: 0 / 0
Как "просканировать" таблицы в схеме?
    #39548726
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Banks AnalyticsЧто еще можете подсказатьНе нужно одну и ту же таблицу сканировать -ннадцать раз.
...
Рейтинг: 0 / 0
Как "просканировать" таблицы в схеме?
    #39548732
Banks AnalyticsЕсть скрипт, который выводит имя столбца и имя таблицы, но работает долго (много таблиц).Скрипт показывай. Как именно там организован поиск? Возможно, дело в его совершенной неоптимальности....
Но в целом - да, тупо просканировать все поля всех таблиц - это не самое быстрое мероприятие для сервера...
...
Рейтинг: 0 / 0
Как "просканировать" таблицы в схеме?
    #39548742
Фотография Banks Analytics
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Функция:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
create or replace FUNCTION VALUE_PRESENT
    (table_name IN VARCHAR2
    ,column_name IN VARCHAR2
    ,TEXT IN VARCHAR2
    )
RETURN NUMBER
AS
    nVAL NUMBER(17);
BEGIN
    BEGIN
    EXECUTE IMMEDIATE
        'select count(*)'||
        ' from '||table_name||
        ' where '||column_name||' like ''%'||TEXT||'%'''
        INTO nval;
    EXCEPTION WHEN OTHERS THEN
        RETURN 0;
    END;
    RETURN nVAL;
END;



Запрос:
Код: plsql
1.
2.
3.
4.
5.
SELECT table_name
     , column_name
FROM COLS
WHERE COLS.data_type LIKE '%CHAR%'
  AND VALUE_PRESENT(table_name, column_name, 'Иванов') > 0;
...
Рейтинг: 0 / 0
Как "просканировать" таблицы в схеме?
    #39548753
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Banks Analytics,
тынц
...
Рейтинг: 0 / 0
Как "просканировать" таблицы в схеме?
    #39548759
Banks Analytics,

первое, что напрашивается на оптимизацию:
чтобы понять содержит ли таблица некое значение - достаточно найти хотя бы ОДНО его вхождение. нет надобности искать ВСЕ вхождения.
...
Рейтинг: 0 / 0
Как "просканировать" таблицы в схеме?
    #39548772
Фотография Banks Analytics
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - Эх
достаточно найти хотя бы ОДНО его вхождение. нет надобности искать ВСЕ вхождения.
Так чтоли?

Код: plsql
1.
AND VALUE_PRESENT(table_name, column_name, 'Иванов') = 1;



Ну я запустил на тестовой схеме из 2-х таблиц. В итоге нашел, но получилось по времени даже в 2 раза дольше, чем вариант ">0"
...
Рейтинг: 0 / 0
Как "просканировать" таблицы в схеме?
    #39548789
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Banks Analytics,

И что ты этим хотел сказать?

Посчитал-то всё равно все вхождения.
...
Рейтинг: 0 / 0
Как "просканировать" таблицы в схеме?
    #39548826
Banks Analytics,

расчет функции надо заканчивать сразу, как только нашлось хотя бы одно вхождение искомого значения....
...
Рейтинг: 0 / 0
Как "просканировать" таблицы в схеме?
    #39548916
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) проверяем наличие, а не подсчитываем:
Код: plsql
1.
2.
3.
        'select 1 from dual where exists(select null'||
        ' from '||table_name||
        ' where '||column_name||' like ''%'||TEXT||'%'')'



2) если в таблице несколько полей, отвечающих критериям поиска, то следует объединить это дело в один запрос вида
Код: plsql
1.
2.
3.
4.
5.
        'select 1 from dual where exists(select null'||
        ' from '||table_name||
        ' where '||column_name||' like ''%'||TEXT||'%''||
' OR '||column_name2||' like ''%'||TEXT2||'%''
)'



3) Если вы работаете с определенной схемой, то не следует заниматься ерундой - составьте уже карту где-что-лежит и проверяйте статиком.
...
Рейтинг: 0 / 0
Как "просканировать" таблицы в схеме?
    #39549022
Фотография Banks Analytics
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот этот ваш код более менее шустрый вроде. попробую им поискать

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
set serveroutput on
declare
  l_pattern varchar2(100) := '%КР-Ф/34/08%';

  cursor cf is
    select table_name,column_name 
      from user_tab_columns
     where data_type = 'VARCHAR2'
     order by table_name;

  t_stmnt varchar2(2000) := 'select count(*) from dual where exists( select null from ';
  l_stmnt varchar2(2000); 
  l_where_clause varchar2(2000) := ' where 1=0';

  l_last_table varchar2(100) := '';
  l_cnt number := 0;
  
  procedure print_query_text (i_text varchar2) is
    l_text varchar2(4000) := i_text;
    l_len number := length(l_text);
    l_pieces number := ceil(l_len/250);
  begin
    for i in 1..l_pieces loop
      dbms_output.put_line(substr(i_text, 1+250*(i-1),least(250,l_len-250*(i-1))));
    end loop;
    dbms_output.new_line;
  end;

begin
  for i in cf loop
    if l_last_table <> i.table_name then
    --  dbms_output.put_line(l_stmnt||l_where_clause);
      execute immediate l_stmnt || l_where_clause ||')' into l_cnt;
      if l_cnt > 0 then 
        print_query_text ('select * from ' || l_last_table || l_where_clause || ';');
      end if;
      l_cnt := 0;
      l_where_clause := ' where 1=0';
    end if;
    
    l_last_table := i.table_name;
    
    l_stmnt := t_stmnt || i.table_name;
    
    l_where_clause := l_where_clause || ' OR ' || i.column_name || ' like ''' ||l_pattern||'''';
   
  end loop;
  execute immediate l_stmnt || l_where_clause ||')' into l_cnt;
  if l_cnt > 0 then 
    print_query_text ('select * from ' || l_last_table || l_where_clause || ';');
  end if;
end;
...
Рейтинг: 0 / 0
Как "просканировать" таблицы в схеме?
    #39549116
Фотография Banks Analytics
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
123ййBanks Analytics,
тынц
Не рабочие скрипты. На тестовой схеме (где десяток таблиц) все отлично работает. Как только на боевой схеме запускаю, то сыпятся различные ошибки. Собственно про них в той теме и пишут.
...
Рейтинг: 0 / 0
Как "просканировать" таблицы в схеме?
    #39549151
Banks Analytics,

Тексты ошибок предлагается угадать?
...
Рейтинг: 0 / 0
Как "просканировать" таблицы в схеме?
    #39549364
Фотография Banks Analytics
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторError report -
ORA-04063: view "APPS.TMP_CD_HISTORY" has errors
ORA-06512: at line 32
04063. 00000 - "%s has errors"
*Cause: Attempt to execute a stored procedure or use a view that has
errors. For stored procedures, the problem could be syntax errors
or references to other, non-existent procedures. For views,
the problem could be a reference in the view's defining query to
a non-existent table.
Can also be a table which has references to non-existent or
inaccessible types.
*Action: Fix the errors and/or create referenced objects as necessary.

TMP_CD_HISTORY это старая вьюха в которой не выполняется SQL (таких много и они чужие). То есть скрипт "спотыкается" на них.
...
Рейтинг: 0 / 0
Как "просканировать" таблицы в схеме?
    #39549365
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Banks Analytics,

Чужие скрипты, в которых ты не стал разбираться, а бездумно запустил, теперь виноваты в ошибках твоей вьюхи, это ужасно. И блок begin... exception написать самостоятельно конечно же невероятно трудно.
...
Рейтинг: 0 / 0
Как "просканировать" таблицы в схеме?
    #39549366
Фотография Banks Analytics
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторError report -
ORA-00904: "ACCOUNTI1": недопустимый идентификатор
ORA-06512: на line 32
00904. 00000 - "%s: invalid identifier"
А вот это еще более распространенная ошибка. Тут вообще непонятно в чем дело. Возможно затык на тех столбцах, в которых тип UNIKOWN
...
Рейтинг: 0 / 0
Как "просканировать" таблицы в схеме?
    #39549367
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И какой делается вывод? Конечно же!
Banks AnalyticsНе рабочие скрипты.
...
Рейтинг: 0 / 0
Как "просканировать" таблицы в схеме?
    #39549368
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Banks AnalyticsА вот это еще более распространенная ошибка.
Правда? Где распространённая и кем?

Ты хотя бы осознал, что вообще конкретно этот скрипт делает и о чём тебе Э-эх говорил про первое вхождение?
...
Рейтинг: 0 / 0
Как "просканировать" таблицы в схеме?
    #39549371
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Banks AnalyticsТо есть скрипт "спотыкается" на них.Перевожу: "Думать нечем - мозгов нет. Вынесете мне готовое и пережёванное да на блюдечке с голубой каёмочкой"
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как "просканировать" таблицы в схеме?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]