Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: Общие вопросы > sql Parser |
Автор: Samotnik 16.11.2009, 19:38 | ||
Привет ! Задача, вроде на первый взгляд тривиальная, но догодаться я не могу как ее решить ![]() Условие : Есть .sql файл. ![]() Задание: Выполнить его с помощью jdbc т.е. нужен какойто парсер, который будет читать до определенных символов, и отдельно их выполнять, или записывать файл... Вобщем я не знаю. Нужно это для того, что есть некая большая БД. Но она довольно часто обновляется (раз в день, или два) И вот нужно этот процесс автоматизировать. т.е. нужно написать класс, или метод, который будет считывать общий большой файл с sql выражениями, и исполнять их в БД с помощью jdbc может кто-то знает решение этой задачи ? Может есть готовое опен сорс (в виде жарки ![]() Для примера, вот небольшой кусок из огромного файла
Как бы вы его считывали, парсири и выполняли ? Подскажите пажалста ![]() Важное замечание: как можно видеть из кода, нужна парсилка, умеющая работать с PL/SQL |
Автор: Samotnik 16.11.2009, 23:19 |
никто таким не занимался ? Сформулирую еще раз: Есть БД, уже сформированная. Есть файлик *.sql, в который каждый день кто-то вносит дополнения. Так вот нужно написать метод или класс, который будет читать этот файл, выбирать из него скрипты и запускать их. (пример скриптов, я выложил постом выше) ![]() Подкиньте пажалста идеи, или если есть опен сорс решение, то будет вообще мега круто ![]() |
Автор: garbuz 16.11.2009, 23:28 |
Samotnik, маловато деталей. Кто-то живой пишет этот файл, или он тоже генерится? Какие именно куски должны выбираться из файла? только новые? Или какие-то особенные? |
Автор: garbuz 17.11.2009, 00:33 | ||||
Samotnik, задача ясна. А что мешает разбивать на токены по
А еще просто договориться, чтобы все ставили либо перед либо после какой-нить токен, по которому ты мог разбивать большой файл на части. Типа
|
Автор: Samotnik 17.11.2009, 00:38 |
ну это крайний вариант ![]() К сожалению этот вариант отметается, т.к. нету таковой возможности, не я должен разработчиков под себя подстраивать, а наоборот - я должен написать что-то универсальное, что должно работать. нашел, кстати парсер http://www.gibello.com/code/zql/ нужно будет с ним поразбираться . может подойдет ... |
Автор: ivanovpv 17.11.2009, 08:59 |
Нд-а-а-а жестокая задача... Ладно бы речь шла о парсере строки, но тут фактически речь идет о полноценном компиляторе: разбор управляющих конструкций, переменных, параметров и проч. Я бы пошел 2-мя путями: а) Поискал бы какой-нить парсер PL/SQL в сети что-то похожее болтается б) Попробовал бы что-то наподобие antlr/lex/yacc - универсальных лексических анализаторов с задаваемой грамматикой (неплохая подборка http://catalog.compilertools.net/java.html) и генерирующих исходный текст компилятора/парсера. Правда там вопрос станет о грамматике PL/SQL - составление коего на языке анализатора само по себе непростая задача. Надо надеяться, что всемогущий гугль также здесь поможет. По крайней мере я находил в свое время грамматику фортрана для ANTLR в сети. |
Автор: avvo 17.11.2009, 10:37 |
Это ведь файл в формате SQLPlus, т.е. файл с выражениями SQL или PL/SQL разделенный слэшем в отдельной строке. Надо просто разбить его на куски по слэшу (в отдельной строке!) и выполнять step by step. Оракл всё прекрасно выполнит, и SQL и PL/SQL, ему пофиг. Главное, после SQL выражений не забывать commit делать. Ну и еще надо как-то запоминать, где остановились, на конкретном экземпляре БД. Или получать из репозитория дифы. Файл, он же только расти может, если я правильно понял. |
Автор: Samotnik 17.11.2009, 10:43 | ||
Хорошо, я тоже об этом думал - чиать до слеша, но ведь в комментариях тоже слешы есть ![]() |
Автор: avvo 17.11.2009, 10:49 | ||
В комментариях не должно быть слэша в отдельной строке. Иначе SQLPlus этот файл выплюнет. |
Автор: Samotnik 17.11.2009, 11:01 | ||
avvo, хммм..... ты прав ![]() сейчас весь файл проверю. Впринципе это вариант ![]() Добавлено через 12 минут и 17 секунд avvo, не катит :((( нашел скриптовые вставки, которые просто что-то удаляют или добавляют
как с этим быть ? моя читалка до слэша, этот код не выполнит ( |
Автор: avvo 17.11.2009, 11:29 | ||||
Ну это не беда, ты каждое выражение заворачивай в declare begin ... end; |
Автор: Samotnik 17.11.2009, 11:33 | ||
ясно ... т.е. все сводится к тому, что готового решения нету ? Нужно самоу регулярки писать ? |
Автор: avvo 17.11.2009, 11:58 | ||
Так ведь у тебя уже все работает. Просто каждое выражение заворачивай в declare begin end; Даже если будет в итоге
оракл это сожрет. Есть iBatis ScriptRuner, но он тоже простой как карандаш. Есть еще куча разных фронтендов для sql с опенсоурс http://java-source.net/open-source/sql-clients, можно покопаться. Опять же можно выполнить sqlplus со скриптом. Но я думаю, что просто разделить по слэшу, обернуть и выполнить будет достаточно. Главное тут, я думаю, придумать, как не выполнить лишнего, т.е. повторно не выполнять, то, что уже выполнено. |
Автор: LSD 17.11.2009, 12:01 |
Просто вызови с помощью Runtime.exec() SQL*Plus и передай ему в качестве параметра этот файл. |
Автор: Samotnik 17.11.2009, 12:02 | ||
тоже думал, но а если нету SQL plus на компе ? Добавлено через 24 секунды поэтому и хотелось через jdbc |
Автор: Samotnik 17.11.2009, 13:29 |
2 LSD нашел еще круче утилитку с консоли запускается sqlplus (c:\oracle\product\10.2.0\client_1\BIN\sqlplus.exe ) Если написать батник, то вприницпе проблема решится НО как быть с ошибками ? ![]() ![]() |
Автор: alex_nevolin 17.11.2009, 19:19 | ||||
По сути это и есть SQL*Plus. Т.е. на машине стоит Oracle Client. Его всегда можно запустить с параметрами для вывода ошибок и всего остального в файл. Также провертье есть ли у вас в файле команды коннекта к базе. Они могут быть в скрипте или передаваться праметрами. Общий вид запуска sqlplus должен выглядеть как-то так:
Далее можно считать файл лога logs.log В любом случае самое сложное тут на мой взгляд определять что уже выполнялось из файла а что нет, иначе будут проблемы при повторном выполнении стейтментов из скрипта. В целом думаю эту задачу нужно решать именно через Oracle Client a не через jdbc. |
Автор: Samotnik 18.11.2009, 12:01 | ||||
Как это сделать ? Пытаюсь вот так
и ничего не происходит. Вообще. Ошибок нет, эксепшенов тоже нет, и результата тоже нет. ![]() |
Автор: Samotnik 18.11.2009, 12:53 | ||||||
от так пишет ошибко
Добавлено через 44 секунды Хотя с командной строки от таким методом запускается без проблем
|
Автор: Samotnik 18.11.2009, 13:13 | ||
решено
от так заработало ![]() |
Автор: aleksandy 19.11.2009, 14:05 | ||
Мы в проекте для таких целей используем http://autopatch.sourceforge.net/ |