Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> oracle поиск значения по диапазону таблиц 
V
    Опции темы
Eland
Дата 12.5.2006, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 20.1.2006

Репутация: нет
Всего: нет



Доброго времени суток.

Есть такая задача:

Надо найти в диапазоне таблиц, например таком:

Код

select at.TABLE_NAME from ALL_TAB_COLUMNS at
where at.owner like '%AAA%'
and at.table_name like 'AAB_%'


какое-то значение, напрмер строку "тра-та-та".

Надо произвести поиск по всем полям выбранного диапазона таблиц на предмет присутствия этой строки и вывести список таблиц, в которых встречается эта строка.

Помогите плз. Я сам с pl/sql не знаком и вообще с sql знаком слабо. Помогите плз.. 
PM MAIL   Вверх
LSD
Дата 13.5.2006, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



Что значит найти? Эта строка может встретится в 10 совершенно разных по структуре таблиц, и что делать тогда? Что должна вернуть процедура, найденые строки, ROWID этих сток или еще что? 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Eland
Дата 14.5.2006, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 20.1.2006

Репутация: нет
Всего: нет



Должна вернуть просто имена таблиц и столбцов, где встречаются записи.
Если в 2х таблицах встречается, то вывод имён 2х этих таблиц и имен столбцов, если в 3х - в 3х и т.д. 
PM MAIL   Вверх
Sqlninja
Дата 15.5.2006, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 353
Регистрация: 15.5.2006
Где: San Francisco, CA

Репутация: 13
Всего: 13



Hi,

1) создаем служебную таблицу (дальше будет понятно для чего):

Код


CREATE TABLE tnames(x VARCHAR2(100))
/

2) запускаем скрипт:
Код


DECLARE
   CURSOR tables_cur
   IS
      SELECT atc.table_name
           , atc.column_name
           , atc.data_type
           , atc.owner
        FROM all_tab_columns atc
       WHERE UPPER (atc.owner) LIKE 'SCOTT%' AND UPPER (atc.table_name) LIKE 'EMP%'; -- тут меняем параметры на свои
BEGIN
   FOR c IN tables_cur
   LOOP
      IF c.data_type = 'VARCHAR2' 
      THEN
         EXECUTE IMMEDIATE    'insert into tnames select '
                           || c.column_name
                           || ' from '
                           || c.owner
                           || '.'
                           || c.table_name
                           || ' where '
                           || c.column_name
                           || ' = '
                           || '''SMITH'''; -- искомая строка
      END IF;

      IF SQL%ROWCOUNT > 0
      THEN
         DBMS_OUTPUT.put_line (c.table_name);
      END IF;

      EXIT WHEN tables_cur%NOTFOUND;
   END LOOP;
END;
/

 

Это сообщение отредактировал(а) Sqlninja - 15.5.2006, 01:11


--------------------
It's better to burn out than to fade away.
PM MAIL WWW ICQ   Вверх
Eland
Дата 15.5.2006, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 20.1.2006

Репутация: нет
Всего: нет



Спасибо огромное !
Вот теперь я почти совсем счастлив.
Я его немного модифицировал:

Код

DECLARE
   CURSOR tables_cur    
   IS    
      SELECT atc.table_name    
           , atc.column_name    
           , atc.data_type    
           , atc.owner    
        FROM all_tab_columns atc    
       WHERE UPPER (atc.owner) LIKE '%AAA%' AND UPPER (atc.table_name) LIKE '%AAA_%';    
BEGIN    
   FOR c IN tables_cur    
   LOOP    
      IF c.data_type = 'VARCHAR2'    
      THEN    
         EXECUTE IMMEDIATE 'insert into tnames1 select '
                           || '''' || c.table_name || ''''
                           || ', '
                           || c.column_name    
                           || ' from '    
                           || c.owner    
                           || '.'    
                           || c.table_name    
                           || ' where '    
                           || c.column_name    
                           || ' like '    
                           || '''%AAA_AAA%''';
      END IF;    
      IF SQL%ROWCOUNT > 0    
      THEN    
         DBMS_OUTPUT.put_line (c.table_name);    
      END IF;    
      EXIT WHEN tables_cur%NOTFOUND;    
   END LOOP;    
END;

Только одного мне не хватает для полного счастья:
Запускаю его из PL/SQL Developer_а, скриптик работает, через несколько секунд работу заканчивает, говорит, мол, "done", всё пучком и всё такое.
Делаю запрос таблички с результатами, а там пусто ! =(
И данные там проявляются только минут через 10. Как ускорить процесс проявления ? Или он просто на заднем фоне выполняется ? 
PM MAIL   Вверх
Sqlninja
Дата 15.5.2006, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 353
Регистрация: 15.5.2006
Где: San Francisco, CA

Репутация: 13
Всего: 13



Запрос из таблички с результатами делать не надо. Она нужна только для того, чтобы сработал DML оператор в нашем EXECUTE IMMEDIATE .  

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

В какой среде Вы выполняете скрипт?  Выполните SET SERVEROUTPUT ON,  иначе DBMS_OUTPUT ничего Вам не напишет. 


--------------------
It's better to burn out than to fade away.
PM MAIL WWW ICQ   Вверх
Eland
Дата 15.5.2006, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 20.1.2006

Репутация: нет
Всего: нет



Всё пашет как надо ! =) Спасибо большое =)
Выручил ! 
PM MAIL   Вверх
Sqlninja
Дата 15.5.2006, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 353
Регистрация: 15.5.2006
Где: San Francisco, CA

Репутация: 13
Всего: 13



Рад был помочь.  


--------------------
It's better to burn out than to fade away.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.0486 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.