Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] /SQL/ Поиск значения в ячейках всех таблиц базы данных Oracle (http://forum.oszone.net/showthread.php?t=182285)

EvgeniyQQQ 06-08-2010 11:10 1468045

/SQL/ Поиск значения в ячейках всех таблиц базы данных Oracle
 
Добрый день!
Можно ли на SQL написать запрос к базе данных Oracle, который бы выполнил поиск строкового значения по ячейкам всех имеющихся таблиц и вывел в качестве результата список имён этих таблиц (в которых присутствует искомое значение) ?
Может у кого есть подобный уже готовый примерчик?
Или есть стандартные средства реализующие подобный функционал?
Заранее спасибо :)

noname00.pas 07-08-2010 15:10 1468847

Любопытно, с какой целью такое потребовалось.

Я думаю, что стандартных средств в СУБД для решения такой задачи не существует. Полнотекстовый поиск - это задача несколько иная, чем управление БД.
Зато есть поисковые движки типа Thinking Sphinx. Посмотри вот тут: http://sphinxsearch.com/

Delirium 09-08-2010 00:40 1469672

EvgeniyQQQ, встроенными путями такое сделать не получится. Необходимо минимум 2 цикла - первый берет список таблиц из указанной базы, второй - список полей в таблице . Ну и далее уже в циклах - выборка.

EvgeniyQQQ 09-08-2010 12:07 1469917

noname00.pas, есть у нас PLM-система, она использует СУБД Oracle. Я проводил эксперименты с помощью внешнего приложения, вносил и удалял некоторую информацию... это приложение обращается к базе не напрямую, а через саму PLM. Так вот, я удалил идентификатор одного объекта PLM с помощью внешнего приложения. Пока PLM была запущена, всё работало, но стоило её перезапустить, как она стала ругаться, что не может найти объект с удалённым мной идентификатором и при этом вылетает (завершает свою работу). Вернуть идентификатор на место с помощью внешнего приложения я не могу, так как PLM не запущена. Остаётся только внести его назад в базу в ручную... но вот засада... таблиц много.... очень много, а где хранятся идентификаторы не известно :) С помощью поиска я хочу попытаться найти таблицу в которой хранятся идентификаторы.

EvgeniyQQQ 09-08-2010 19:46 1470245

Delirium, спасибо за ссылки. Они натолкнули меня на правильные мысли :)
Так как в SQL я чайник и разбираться нет времени, то написал поиск используя симбиоз Java и SQL.
Вот сам код, может кому пригодится:
Код:

public static void main(String[] args)
{
        final String SEARCH_STRING_OF_CELL = "Искомый текст в ячейке";
        final String HOST = "localhost";
        final String PORT = "1521";
        final String BASE_ID = "wind";
        final String USER = "guest";
        final String PASSWORD = "guest";
               
        try
        {
                Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
                Connection myCon = DriverManager.getConnection("jdbc:oracle:thin:@" + HOST + ":" + PORT + ":" + BASE_ID, USER, PASSWORD);
                Statement mySt = myCon.createStatement();
                       
                System.out.println("Выполняю поиск...");
                ResultSet rs = mySt.executeQuery("select * from user_tables");
                   
                //Формируем список имён таблиц
                List<String> listTables = new ArrayList<String>();
                while (rs.next()) listTables.add(rs.getString(1));
                   
                for(int i = 0; i<listTables.size(); i++)
                {
                        ResultSet rs1 = mySt.executeQuery("select * from " + listTables.get(i));
                        while(rs1.next())
                        {
                                for(int j = 1; j<rs1.getMetaData().getColumnCount() + 1; j++)
                                {
                                        Object cell = rs1.getObject(j);
                                        if((cell instanceof String) && ((String)cell).compareToIgnoreCase(SEARCH_STRING_OF_CELL) == 0)
                                        {       
                                                System.out.println("Имя таблицы \"" + listTables.get(i) +
                                                                "\", имя столбца \"" + rs1.getMetaData().getColumnName(j) +
                                                                "\", значение \"" + cell + "\"");
                                        }
                                }       
                        }
                }
                       
                mySt.close();
                myCon.close();
        }
        catch(Exception e)
        {
                e.printStackTrace();
        }
        System.out.println("Поиск завершен!");
}



Время: 00:54.

Время: 00:54.
© OSzone.net 2001-