powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Поиск
6 сообщений из 6, страница 1 из 1
Поиск
    #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
Поиск
    #39902514
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С этими вопросами - к автору кривой БД.

В нормальных БД только одна таблица содержит ФИО в заранее известном поле.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Поиск
    #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
Поиск
    #39903303
Misha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
можно построить вьюшку через юнион алл всех таблиц.
если имя поля неизвестно - оптимальнее будет через логическое или искать по всем чаровским полям. запрос формировать динамически.
...
Рейтинг: 0 / 0
Поиск
    #39903490
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помницо мну когда-то выкладывал сюда такой скрипт. Но что-то и сам с ходу не нашел :)
...
Рейтинг: 0 / 0
Поиск
    #39903597
Фотография 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
6 сообщений из 6, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Поиск
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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