Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как "просканировать" таблицы в схеме? / 20 сообщений из 20, страница 1 из 1
06.11.2017, 22:07
    #39548591
Banks Analytics
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как "просканировать" таблицы в схеме?
Есть схема со множеством таблиц. Схема эта закрывается 2 раза в сутки на апдейт - в обед и на ночь.
Мне нужно выяснить имя таблиц по искомому значению (например по номеру договора), но в каких таблицах фигурирует данные по этому договору я не знаю.
Есть скрипт, который выводит имя столбца и имя таблицы, но работает долго (много таблиц). На ночь оставить не получится см. 1-я строка выше, а в период с обеда до вечера жалобы от коллеги, что его скрипты начинают долго работать.
Скопировать эти таблицы в "свою" схему, а потом спокойно обрабатывать, не получится, т.к. не хватит дискового пространства.
Вот думаю может как-то кусками схему сканировать? Сначала первые 100 таблиц, потом 101-200 и т.д, но не знаю как это реализовать, чтобы не с первой скан начинался. Что еще можете подсказать друзья?
...
Рейтинг: 0 / 0
06.11.2017, 22:46
    #39548605
Banks Analytics
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как "просканировать" таблицы в схеме?
Для поиска использую метод с функцией описанный здесь
http://www.cyberforum.ru/post1824587.html
...
Рейтинг: 0 / 0
07.11.2017, 09:08
    #39548726
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как "просканировать" таблицы в схеме?
Banks AnalyticsЧто еще можете подсказатьНе нужно одну и ту же таблицу сканировать -ннадцать раз.
...
Рейтинг: 0 / 0
07.11.2017, 09:28
    #39548732
Как "просканировать" таблицы в схеме?
Banks AnalyticsЕсть скрипт, который выводит имя столбца и имя таблицы, но работает долго (много таблиц).Скрипт показывай. Как именно там организован поиск? Возможно, дело в его совершенной неоптимальности....
Но в целом - да, тупо просканировать все поля всех таблиц - это не самое быстрое мероприятие для сервера...
...
Рейтинг: 0 / 0
07.11.2017, 09:43
    #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
07.11.2017, 09:52
    #39548753
123йй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как "просканировать" таблицы в схеме?
Banks Analytics,
тынц
...
Рейтинг: 0 / 0
07.11.2017, 10:01
    #39548759
Как "просканировать" таблицы в схеме?
Banks Analytics,

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

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



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

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

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

расчет функции надо заканчивать сразу, как только нашлось хотя бы одно вхождение искомого значения....
...
Рейтинг: 0 / 0
07.11.2017, 13:29
    #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
07.11.2017, 15:04
    #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
07.11.2017, 17:11
    #39549116
Banks Analytics
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как "просканировать" таблицы в схеме?
123ййBanks Analytics,
тынц
Не рабочие скрипты. На тестовой схеме (где десяток таблиц) все отлично работает. Как только на боевой схеме запускаю, то сыпятся различные ошибки. Собственно про них в той теме и пишут.
...
Рейтинг: 0 / 0
07.11.2017, 17:47
    #39549151
Как "просканировать" таблицы в схеме?
Banks Analytics,

Тексты ошибок предлагается угадать?
...
Рейтинг: 0 / 0
08.11.2017, 09:47
    #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
08.11.2017, 09:52
    #39549365
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как "просканировать" таблицы в схеме?
Banks Analytics,

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

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


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