Войти

Показать полную графическую версию : [решено] /SQL/ Поиск значения в ячейках всех таблиц базы данных Oracle


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

noname00.pas
07-08-2010, 15:10
Любопытно, с какой целью такое потребовалось.

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

Delirium
09-08-2010, 00:40
EvgeniyQQQ, встроенными путями такое сделать не получится. Необходимо минимум 2 цикла - первый берет список таблиц (http://www.sql.ru/forum/actualthread.aspx?tid=550026) из указанной базы, второй - список полей в таблице (http://www.sql.ru/forum/actualthread.aspx?tid=604568) . Ну и далее уже в циклах - выборка.

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

EvgeniyQQQ
09-08-2010, 19:46
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("Поиск завершен!");
}




© OSzone.net 2001-2012