Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
Теоретические аспекты и практические реализации создания, внедрения и использования баз данных, СУБД, хранилищ.
  • Страница:
  • 1
  • 2
  • 3
  • 4

ТЕМА: Поиск по БД в Oracle

Поиск по БД в Oracle 13 июль 2011 04:37 #1624

  • Nymbos
  • Nymbos аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 46
  • Спасибо получено: 0
Привет!
Исследую структуру БД. Делаю селекты, сопоставляю, сверяю. Вот возникли вопросы. Встретил значение реквизита, которое кроме как в этом справочнике нигде не увидел. Это значение очень важно для меня. Я хочу сделать поиск по БД запросом, потому что таблиц более 2600 и смотреть все я не смогу.

Работаю по сети, у меня есть аккаунт с правом только чтения.

Суть. Выбрать имена таблиц в которых в любом из полей в любой строчке есть заданный реквизит. Возможно ли написать такой селект?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Поиск по БД в Oracle 13 июль 2011 04:47 #1625

  • Den
  • Den аватар
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 44
  • Спасибо получено: 0
Можно просто перебрать все строковые поля всех таблиц на предмет их значения, например, найти все поля где встречается символ 'A':

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Den.

Re: Поиск по БД в Oracle 13 июль 2011 04:48 #1626

  • Den
  • Den аватар
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 44
  • Спасибо получено: 0
SELECT *
FROM (SELECT table_name
           , column_name
           , DBMS_XMLGEN.getXmltype(
               'select count(*) cnt from '||table_name||' where '||column_name||' like ''%A%'''
             ).EXTRACT('ROWSET/ROW/CNT/text()').getNumberVal() cnt
      FROM COLS
      WHERE 1=1
        AND COLS.data_type LIKE '%CHAR%'
     )
WHERE cnt > 0
ORDER BY table_name, column_name;

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Den.

Re: Поиск по БД в Oracle 13 июль 2011 04:50 #1627

  • Nymbos
  • Nymbos аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 46
  • Спасибо получено: 0
Жаль у меня не вышло.
Пишет ошибку:
System.Data.OracleClient.OracleException: ORA-00911: invalid character

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Поиск по БД в Oracle 13 июль 2011 04:51 #1628

  • Den
  • Den аватар
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 44
  • Спасибо получено: 0
Какая версия Oracle? Внутренний подзапрос выполняется?
SELECT table_name
     , column_name
     , DBMS_XMLGEN.getxmltype(
         'select count(*) cnt from '||table_name||' where '||column_name||' like ''%a%'''
       ).EXTRACT('rowset/row/cnt/text()').getNumberVal() cnt
FROM COLS
WHERE cols.data_type LIKE '%CHAR%'
ORDER BY cnt DESC;

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Поиск по БД в Oracle 13 июль 2011 04:59 #1629

ORA-00911: invalid character


В большинстве случаев причина этого в точке с запятой в конце statement-а.

странно вообще:
на запрос ругается так:
ORA-19202: Error occurred in XML processing
ORA-00932: inconsistent datatypes: expected NUMBER got BLOB
ORA-06512: at "SYS.DBMS_XMLGEN", line 288
ORA-06512: at line 1

внутренний запрос начинает выполняться и останавливается с ошибкой:
ORA-19202: Error occurred in XML processing
ORA-00933: SQL command not properly ended
ORA-06512: at "SYS.DBMS_XMLGEN", line 288
ORA-06512: at line 1

Предлагаю вариант с функцией:
CREATE OR REPLACE FUNCTION VALUE_PRESENT
        (table_name IN VARCHAR2
        ,column_name IN VARCHAR2
        ,TEXT IN VARCHAR2
        )
RETURN NUMBER
AS
        nVAL NUMBER(17);
BEGIN
        BEGIN
        EXECUTE IMMEDIATE
                'select count(*)'||
                ' from '||table_name||
                ' where '||column_name||' like ''%'||TEXT||'%'''
                INTO nval;
        EXCEPTION WHEN OTHERS THEN
                RETURN 0;
        END;
        RETURN nVAL;
END;
/
 
SELECT table_name
     , column_name
FROM COLS
WHERE COLS.data_type LIKE '%CHAR%'
  AND VALUE_PRESENT(table_name, column_name, 'SearchText') > 0;

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

  • Страница:
  • 1
  • 2
  • 3
  • 4