Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Поиск / 6 сообщений из 6, страница 1 из 1
13.12.2019, 14:02
    #39902511
inara
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск
И снова к вам за помощью

1. Поиск таблиц, которые содержат fio
Select table_name from sys.user_tab_columns where column_name like 'fio'

2. Затем в найденных таблицах ищем конкретное ФИО
Select * from Талица 1 where FIO like 'Иванов'

Таблиц может много, но не во всех есть Иванов.
Как правильно написать скрипт, чтобы во втором селект вручную не перебирать все таблицы?
И второй вопрос. Если не известно название поля, можно ли найти значение Иванов во всех таблицах?
Спасибо
...
Рейтинг: 0 / 0
13.12.2019, 14:04
    #39902514
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск
С этими вопросами - к автору кривой БД.

В нормальных БД только одна таблица содержит ФИО в заранее известном поле.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.12.2019, 15:19
    #39902583
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск
inara,

1) Попроще: Воспользоваться возможностями sqlplus ( SQL Script )
- генерация sql скрипта
Код: plsql
1.
2.
3.
4.
5.
6.
spool tmp.sql
set feed off head off line 4096 verify off trimspool on pages 0
Select 'Select * from '||table_name ||' where FIO like ''Иванов'';' as cmd
from sys.user_tab_columns where column_name like 'fio';
spool off
@ tmp


2) Посложнее: Воспользоваться dynamic sql
...

p.s.
Dimitry SibiryakovС этими вопросами - к автору кривой БД.

В нормальных БД только одна таблица содержит ФИО в заранее известном поле.


Жизнь не всегда гуманна к нам :)
Например, есть несколько продуктов, в разных схемах и нужно сделать то что ты рекомендуешь,
Или требуется провести реверс инженериг.


Я таких запросов написал кучи, когда нужно было выкопать из oms репозитория связку
номер задания - параметры клонирования базы, из-за идиотского бага который не могли починить 8 месяцев, из-за которой файл параметров,
который имел одно имя для всех заданий, переписывался
при параллельном запуске задачи, а сроки горели синим пламенем.
...
Рейтинг: 0 / 0
16.12.2019, 10:29
    #39903303
Misha111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск
можно построить вьюшку через юнион алл всех таблиц.
если имя поля неизвестно - оптимальнее будет через логическое или искать по всем чаровским полям. запрос формировать динамически.
...
Рейтинг: 0 / 0
16.12.2019, 14:48
    #39903490
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск
Помницо мну когда-то выкладывал сюда такой скрипт. Но что-то и сам с ходу не нашел :)
...
Рейтинг: 0 / 0
16.12.2019, 16:49
    #39903597
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск
inara
И снова к вам за помощью

1. Поиск таблиц, которые содержат fio
Select table_name from sys.user_tab_columns where column_name like 'fio'

2. Затем в найденных таблицах ищем конкретное ФИО
Select * from Талица 1 where FIO like 'Иванов'

Таблиц может много, но не во всех есть Иванов.
Как правильно написать скрипт, чтобы во втором селект вручную не перебирать все таблицы?
И второй вопрос. Если не известно название поля, можно ли найти значение Иванов во всех таблицах?
Спасибо


1.
Код: 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.
with a as (
           select  /*+ materialize */
                   t.owner,
                   t.table_name,
                   c.column_name
             from  dba_tab_columns c,
                   dba_tables t
             where c.column_name = 'FIO'
               and t.owner = c.owner
               and t.table_name = c.table_name
               and t.table_name not like 'MLOG$\_%' escape '\' -- exclude materialized view logs
               and nvl(t.iot_type,'not_iot') not in ('IOT_OVERFLOW','IOT_MAPPING') -- exclude iot overflow and mapping
               and t.temporary = 'N' -- exclude temporary tables
               and t.secondary = 'N' -- exclude oracle text index tables and other "non-tables"
               and t.table_name not in (
                                        select  e.table_name
                                          from  dba_external_tables e
                                          where e.owner = t.owner
                                       ) -- exclude external tables
          )
select  owner,
        table_name
  from  a
  where xmlcast(
                xmlquery(
                         '$X/ROWSET/ROW/C'
                         passing xmltype(
                                         dbms_xmlgen.getxml(
                                                            'select  count(*) c
                                                               from "' || a.owner || '"."' || a.table_name || '"
                                                               where "' || a.column_name || Q'[" = 'Иванов'
                                                                 and rownum = 1]'
                                                           )
                                        ) as "X"
                         returning content
                        )
                as integer
               ) = 1
/



2.
Код: 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.
with a as (
           select  /*+ materialize */
                   t.owner,
                   t.table_name,
                   c.column_name
             from  dba_tab_columns c,
                   dba_tables t
             where c.data_type in (
                                   'CHAR',
                                   'VARCHAR2'
                                  )
               and t.owner = c.owner
               and t.table_name = c.table_name
               and t.table_name not like 'MLOG$\_%' escape '\' -- exclude materialized view logs
               and nvl(t.iot_type,'not_iot') not in ('IOT_OVERFLOW','IOT_MAPPING') -- exclude iot overflow and mapping
               and t.temporary = 'N' -- exclude temporary tables
               and t.secondary = 'N' -- exclude oracle text index tables and other "non-tables"
               and t.table_name not in (
                                        select  e.table_name
                                          from  dba_external_tables e
                                          where e.owner = t.owner
                                       ) -- exclude external tables
          )
select  owner,
        table_name,
        column_name
  from  a
  where xmlcast(
                xmlquery(
                         '$X/ROWSET/ROW/C'
                         passing xmltype(
                                         dbms_xmlgen.getxml(
                                                            'select  count(*) c
                                                               from "' || a.owner || '"."' || a.table_name || '"
                                                               where "' || a.column_name || Q'[" = 'Иванов'
                                                                 and rownum = 1]'
                                                           )
                                        ) as "X"
                         returning content
                        )
                as integer
               ) = 1
/



Ну и список исключений скорее всего не полный особенно если 19C.

SY.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Поиск / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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