Можно ли запросом проверить содержимое всех справочников
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Матвеев Евгений Профи
Вступление в Клуб: 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 объединять запросы этих полей из таблиц, с условием на вхождение. Обернуть циклом например, внутри которого вывод лога.
Потом динамикой формировать некий пакет/библиотеку из этого всего. Потом просто вызвать и читать лог.
Ну дальше полет фантазии  |
|
 |
prankster Профи
Вступление в Клуб: 22.08.2014
|
Ср Сен 09, 2015 09:48  Re: Можно ли запросом проверить содержимое всех справочников |
|
Полезность: 1
|
prankster пишет: | Матвеев Евгений пишет: | Цитата: |
При желании можно, только не запросом. Написать процедуру, которая пробежит по всему словарю, по всем строковым/мемо полям.. Долго конечно, но можно распараллелить.
|
Как это можно сделать? |
Писать проход по all_tab_columns (только по текстовым полям, брать только с размером большим длины БИКа), с составлением текста в clob, в тексте через union all объединять запросы этих полей из таблиц, с условием на вхождение. Обернуть циклом например, внутри которого вывод лога.
Потом динамикой формировать некий пакет/библиотеку из этого всего. Потом просто вызвать и читать лог.
Ну дальше полет фантазии  |
Можно извращаться (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
Не уверен, что работать будет (а точнее, что вообще закончит выполнение когда-нибудь, скорее вылезет что-то вроде "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 пытаюсь выгрузить |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|