![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
Samotnik |
|
|||
![]() Super star ! ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 7192 Регистрация: 4.11.2006 Где: Минск City Репутация: 8 Всего: 191 |
Привет !
Задача, вроде на первый взгляд тривиальная, но догодаться я не могу как ее решить ![]() Условие : Есть .sql файл. ![]() Задание: Выполнить его с помощью jdbc т.е. нужен какойто парсер, который будет читать до определенных символов, и отдельно их выполнять, или записывать файл... Вобщем я не знаю. Нужно это для того, что есть некая большая БД. Но она довольно часто обновляется (раз в день, или два) И вот нужно этот процесс автоматизировать. т.е. нужно написать класс, или метод, который будет считывать общий большой файл с sql выражениями, и исполнять их в БД с помощью jdbc может кто-то знает решение этой задачи ? Может есть готовое опен сорс (в виде жарки ![]() Для примера, вот небольшой кусок из огромного файла
Как бы вы его считывали, парсири и выполняли ? Подскажите пажалста ![]() Важное замечание: как можно видеть из кода, нужна парсилка, умеющая работать с PL/SQL Это сообщение отредактировал(а) Samotnik - 16.11.2009, 19:47 |
|||
|
||||
Samotnik |
|
|||
![]() Super star ! ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 7192 Регистрация: 4.11.2006 Где: Минск City Репутация: 8 Всего: 191 |
никто таким не занимался ?
Сформулирую еще раз: Есть БД, уже сформированная. Есть файлик *.sql, в который каждый день кто-то вносит дополнения. Так вот нужно написать метод или класс, который будет читать этот файл, выбирать из него скрипты и запускать их. (пример скриптов, я выложил постом выше) ![]() Подкиньте пажалста идеи, или если есть опен сорс решение, то будет вообще мега круто ![]() |
|||
|
||||
garbuz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 677 Регистрация: 22.1.2008 Репутация: 3 Всего: 11 |
Samotnik, маловато деталей.
Кто-то живой пишет этот файл, или он тоже генерится? Какие именно куски должны выбираться из файла? только новые? Или какие-то особенные? |
|||
|
||||
Samotnik |
|
||||
![]() Super star ! ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 7192 Регистрация: 4.11.2006 Где: Минск City Репутация: 8 Всего: 191 |
да, пишут его люди. Есть БД, есть большой проект. Но каждый день, кому-то нужны маленькие изменения, где-то таблицу подправить, где-то поле отредактировать. И каждый пишет скриптики, примерно такого рода:
Задумка ясна ? Есть файлик sql в который все желающие заносят изменения. Файл находится под репозиторием, т.е. любой чел обновит этот файлик и исполнит у себя недостающие куски кода, для того чтобы весь проект работал. В данный момент я делаю это вручную - мержил свой файл с последней версией из репозитория, брал эти скрипты и исполнял в своей локальной бд. Теперь этот процесс нужно автоматизировать, нужно, чтобы написанный мною код - брал этот файлик, каким то образом его парсил (разбивал на коммит каждого человека) и исполнял его в локальной бд. Легко заметить, что в sql коде есть комментарии каждого чела, который заносит туда свои изменения, и дата, когда он это сделал. Исполняемый код - разный. Если какая-то проверка,то есть слова declare, begin, end и заканчивается символом "слэш" / Но есть код, где просто sql вставки , типа update, select, etc... Поэтому, самому парсить сложно, нужна очень большая регулярка. и пришла мне мысль, что кто-то до меня таким занимался, и есть уже жарка, которая поможет решить проблему. Нужно каким-то образом, прочитать этот файл, и брать из него куски, начинающиесй с комментариев и заканивающимся либо слешем / либо еще чем - нибудь ![]() теперь ясно, что нужно ? Нужно прочитать файл - разбить его на скриптики каждого человека, что их туда занес (начинаются они с комментариев, заканчиваются символом слеш /) и исполнить их в локальной бд, через обычный jdbc ![]() |
||||
|
|||||
garbuz |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 677 Регистрация: 22.1.2008 Репутация: 3 Всего: 11 |
Samotnik, задача ясна.
А что мешает разбивать на токены по
А еще просто договориться, чтобы все ставили либо перед либо после какой-нить токен, по которому ты мог разбивать большой файл на части. Типа
|
||||
|
|||||
Samotnik |
|
|||
![]() Super star ! ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 7192 Регистрация: 4.11.2006 Где: Минск City Репутация: 8 Всего: 191 |
ну это крайний вариант ![]() К сожалению этот вариант отметается, т.к. нету таковой возможности, не я должен разработчиков под себя подстраивать, а наоборот - я должен написать что-то универсальное, что должно работать. нашел, кстати парсер zsql нужно будет с ним поразбираться . может подойдет ... |
|||
|
||||
ivanovpv |
|
|||
![]() Варвар ![]() ![]() Профиль Группа: Участник Сообщений: 639 Регистрация: 26.1.2005 Где: Москва Репутация: 4 Всего: 28 |
Нд-а-а-а жестокая задача... Ладно бы речь шла о парсере строки, но тут фактически речь идет о полноценном компиляторе: разбор управляющих конструкций, переменных, параметров и проч.
Я бы пошел 2-мя путями: а) Поискал бы какой-нить парсер PL/SQL в сети что-то похожее болтается б) Попробовал бы что-то наподобие antlr/lex/yacc - универсальных лексических анализаторов с задаваемой грамматикой (неплохая подборка здесь) и генерирующих исходный текст компилятора/парсера. Правда там вопрос станет о грамматике PL/SQL - составление коего на языке анализатора само по себе непростая задача. Надо надеяться, что всемогущий гугль также здесь поможет. По крайней мере я находил в свое время грамматику фортрана для ANTLR в сети. -------------------- Aut viam inveniam aut faciam |
|||
|
||||
avvo |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 11.9.2007 Репутация: нет Всего: 4 |
Это ведь файл в формате SQLPlus, т.е. файл с выражениями SQL или PL/SQL разделенный слэшем в отдельной строке.
Надо просто разбить его на куски по слэшу (в отдельной строке!) и выполнять step by step. Оракл всё прекрасно выполнит, и SQL и PL/SQL, ему пофиг. Главное, после SQL выражений не забывать commit делать. Ну и еще надо как-то запоминать, где остановились, на конкретном экземпляре БД. Или получать из репозитория дифы. Файл, он же только расти может, если я правильно понял. |
|||
|
||||
Samotnik |
|
|||
![]() Super star ! ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 7192 Регистрация: 4.11.2006 Где: Минск City Репутация: 8 Всего: 191 |
Хорошо, я тоже об этом думал - чиать до слеша, но ведь в комментариях тоже слешы есть ![]() |
|||
|
||||
avvo |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 11.9.2007 Репутация: нет Всего: 4 |
В комментариях не должно быть слэша в отдельной строке. Иначе SQLPlus этот файл выплюнет. |
|||
|
||||
Samotnik |
|
|||
![]() Super star ! ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 7192 Регистрация: 4.11.2006 Где: Минск City Репутация: 8 Всего: 191 |
avvo, хммм..... ты прав
![]() сейчас весь файл проверю. Впринципе это вариант ![]() Добавлено через 12 минут и 17 секунд avvo, не катит :((( нашел скриптовые вставки, которые просто что-то удаляют или добавляют
как с этим быть ? моя читалка до слэша, этот код не выполнит ( |
|||
|
||||
avvo |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 11.9.2007 Репутация: нет Всего: 4 |
Ну это не беда, ты каждое выражение заворачивай в declare begin ... end; |
||||
|
|||||
Samotnik |
|
|||
![]() Super star ! ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 7192 Регистрация: 4.11.2006 Где: Минск City Репутация: 8 Всего: 191 |
||||
|
||||
avvo |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 11.9.2007 Репутация: нет Всего: 4 |
Так ведь у тебя уже все работает. Просто каждое выражение заворачивай в declare begin end;
Даже если будет в итоге
оракл это сожрет. Есть iBatis ScriptRuner, но он тоже простой как карандаш. Есть еще куча разных фронтендов для sql с опенсоурс тут, можно покопаться. Опять же можно выполнить sqlplus со скриптом. Но я думаю, что просто разделить по слэшу, обернуть и выполнить будет достаточно. Главное тут, я думаю, придумать, как не выполнить лишнего, т.е. повторно не выполнять, то, что уже выполнено. |
|||
|
||||
LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Просто вызови с помощью Runtime.exec() SQL*Plus и передай ему в качестве параметра этот файл.
-------------------- 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. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |