CftClub.ru
Клуб специалистов ЦФТ-Банк

Можно ли запросом проверить содержимое всех справочников

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Уроки ЦФТ-Банк для начинающих
Предыдущая тема :: Следующая тема  
Автор Сообщение
Матвеев Евгений
Профи


Вступление в Клуб: 31.01.2012
СообщениеВт Сен 08, 2015 14:15   Можно ли запросом проверить содержимое всех справочников Ответить с цитатой
Полезность: Нет оценки
Добрый день, коллеги
Можно ли запросом(ами) проверить содержимое всех справочников(а лучше и в иных местах) на предмет наличия скажем статически прописанного номера БИК или корр.счета

Запрос вида
select * from sources a where a.text like '%01010101%'
ищет по исходникам, тут уже всё просмотрели

Нужно вытащить скажем из групп настроек, из настроек, любых иных, где есть такой текст
prankster
Профи


Вступление в Клуб: 22.08.2014
СообщениеВт Сен 08, 2015 14:46   Re: Можно ли запросом проверить содержимое всех справочников Ответить с цитатой
Полезность: 1
Матвеев Евгений пишет:
Добрый день, коллеги
Можно ли запросом(ами) проверить содержимое всех справочников(а лучше и в иных местах) на предмет наличия скажем статически прописанного номера БИК или корр.счета

Запрос вида
select * from sources a where a.text like '%01010101%'
ищет по исходникам, тут уже всё просмотрели

Нужно вытащить скажем из групп настроек, из настроек, любых иных, где есть такой текст


При желании можно, только не запросом. Написать процедуру, которая пробежит по всему словарю, по всем строковым/мемо полям.. Долго конечно, но можно распараллелить. Только вот думаю не стоит..

Лучше все-таки обозначить возможные места, типа групп настроек, шаблонов документов, просто настроек и т.п., только в них искать.
Матвеев Евгений
Профи


Вступление в Клуб: 31.01.2012
СообщениеВт Сен 08, 2015 15:03   Re: Можно ли запросом проверить содержимое всех справочников Ответить с цитатой
Полезность: Нет оценки
Цитата:

При желании можно, только не запросом. Написать процедуру, которая пробежит по всему словарю, по всем строковым/мемо полям.. Долго конечно, но можно распараллелить.


Как это можно сделать?
prankster
Профи


Вступление в Клуб: 22.08.2014
СообщениеВт Сен 08, 2015 15:22   Re: Можно ли запросом проверить содержимое всех справочников Ответить с цитатой
Полезность: Нет оценки
Матвеев Евгений пишет:
Цитата:

При желании можно, только не запросом. Написать процедуру, которая пробежит по всему словарю, по всем строковым/мемо полям.. Долго конечно, но можно распараллелить.


Как это можно сделать?


Писать проход по all_tab_columns (только по текстовым полям, брать только с размером большим длины БИКа), с составлением текста в clob, в тексте через union all объединять запросы этих полей из таблиц, с условием на вхождение. Обернуть циклом например, внутри которого вывод лога.
Потом динамикой формировать некий пакет/библиотеку из этого всего. Потом просто вызвать и читать лог.

Ну дальше полет фантазии Smile
prankster
Профи


Вступление в Клуб: 22.08.2014
СообщениеСр Сен 09, 2015 09:48   Re: Можно ли запросом проверить содержимое всех справочников Ответить с цитатой
Полезность: 1
prankster пишет:
Матвеев Евгений пишет:
Цитата:

При желании можно, только не запросом. Написать процедуру, которая пробежит по всему словарю, по всем строковым/мемо полям.. Долго конечно, но можно распараллелить.


Как это можно сделать?


Писать проход по all_tab_columns (только по текстовым полям, брать только с размером большим длины БИКа), с составлением текста в clob, в тексте через union all объединять запросы этих полей из таблиц, с условием на вхождение. Обернуть циклом например, внутри которого вывод лога.
Потом динамикой формировать некий пакет/библиотеку из этого всего. Потом просто вызвать и читать лог.

Ну дальше полет фантазии Smile


Можно извращаться (pl/sql), например так:
Код:

declare
  clBody clob;
  type str_tbl_type is table of varchar2(200);
  tblStr str_tbl_type;

  procedure put_to_clob(p_text in varchar2) is
  begin
    dbms_lob.writeappend(clBody, length(p_text||chr(10)), p_text||chr(10));
  end;

begin
  dbms_lob.createtemporary(clBody, false);

  select 'select x.id,  ''' || c.class_id || ''', x.' || x.column_name || ', ''' ||
   x.column_name || ''' from ' || c.TABLE_NAME || ' x where x.' ||
   x.column_name || ' like ''%01010101%''' bulk collect
    into tblStr
    from all_tab_columns x, ibs.class_tables c
   where x.owner = 'IBS'
     and x.data_type in ('VARCHAR2')
     and x.TABLE_NAME = c.TABLE_NAME
     and x.DATA_LENGTH > 8
     and c.TABLE_NAME like 'Z#%';

  declare
    nCount number;
  begin
    nCount := tblStr.count;
    put_to_clob('create table TMP_SOME_TABLE(id, class_id, c_value, c_column) as select * from (');
    for i in 1 .. nCount loop
      put_to_clob(tblStr(i));
      if i < nCount then
        put_to_clob('union all');
      end if;
    end loop;
    put_to_clob(')');
  end;
 
  execute immediate clBody;

  dbms_lob.freetemporary(clBody);
  tblStr.delete;
end;


И спустя n дней проверить таблицу TMP_SOME_TABLE Laughing
Не уверен, что работать будет (а точнее, что вообще закончит выполнение когда-нибудь, скорее вылезет что-то вроде "snapshot too old"), но раз уж начали копать в эту сторону..

Надежнее по небольшой порции таблиц в цикле обрабатывать, с возможностью повторного выполнения при исключительной ситуации (+ проверка, что класс еще не лежит в темповой таблице).
Матвеев Евгений
Профи


Вступление в Клуб: 31.01.2012
СообщениеСр Сен 09, 2015 10:23    Ответить с цитатой
Полезность: Нет оценки
Код:

  select 'select x.id,  ''' || c.class_id || ''', x.' || x.column_name || ', ''' ||
   x.column_name || ''' from ' || c.TABLE_NAME || ' x where x.' ||
   x.column_name || ' like ''%01010101%''' bulk collect
    into tblStr
    from all_tab_columns x, ibs.class_tables c
   where x.owner = 'IBS'
     and x.data_type in ('VARCHAR2')
     and x.TABLE_NAME = c.TABLE_NAME
     and x.DATA_LENGTH > 8
     and c.TABLE_NAME like 'Z#%';


Просматриваются только поля типа 'VARCHAR2'
Я правильно понял?

Там же еще 250 прочих типов

Код:

select a.DATA_TYPE from all_tab_columns a group by a.DATA_TYPE
prankster
Профи


Вступление в Клуб: 22.08.2014
СообщениеСр Сен 09, 2015 10:39    Ответить с цитатой
Полезность: 1
Матвеев Евгений пишет:
Код:

  select 'select x.id,  ''' || c.class_id || ''', x.' || x.column_name || ', ''' ||
   x.column_name || ''' from ' || c.TABLE_NAME || ' x where x.' ||
   x.column_name || ' like ''%01010101%''' bulk collect
    into tblStr
    from all_tab_columns x, ibs.class_tables c
   where x.owner = 'IBS'
     and x.data_type in ('VARCHAR2')
     and x.TABLE_NAME = c.TABLE_NAME
     and x.DATA_LENGTH > 8
     and c.TABLE_NAME like 'Z#%';


Просматриваются только поля типа 'VARCHAR2'
Я правильно понял?

Там же еще 250 прочих типов

Код:

select a.DATA_TYPE from all_tab_columns a group by a.DATA_TYPE



Остальные не нужны, думаю (очень сомневаюсь в использовании raw, clob и т.п. для этого):

Код:

select distinct a.DATA_TYPE from all_tab_columns a where a.TABLE_NAME in ('Z#MAIN_DOCUM', 'Z#CLIENT', 'Z#PATTERN', 'Z#FACT_OPER', 'Z#PROPERTIES', 'Z#FP_TUNE', 'Z#FP_TUNE_VAL', 'Z#PRODUCT', 'Z#PR_CRED')


1 NUMBER
2 DATE
3 VARCHAR2
Матвеев Евгений
Профи


Вступление в Клуб: 31.01.2012
СообщениеСр Сен 09, 2015 10:42    Ответить с цитатой
Полезность: Нет оценки
Согласен. Сегодня попробую, времени мало уже осталось, отпишусь по итогам.
К вечеру... Пока shablon_doc пытаюсь выгрузить
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Уроки ЦФТ-Банк для начинающих Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru