Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> sql Parser 
V
    Опции темы
Samotnik
Дата 16.11.2009, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



Привет ! 
Задача, вроде на первый взгляд тривиальная, но догодаться я не могу как ее решить smile 
Условие :
Есть  .sql  файл. smile  
Задание:
Выполнить его с помощью jdbc


т.е. нужен какойто парсер, который будет читать до определенных символов, и отдельно их выполнять, или записывать файл... Вобщем я не знаю. 

Нужно это для того, что есть некая большая БД. Но она довольно часто обновляется (раз в день, или два) И вот нужно этот процесс автоматизировать. т.е. нужно написать класс, или метод, который будет считывать общий большой файл с sql выражениями, и исполнять их в БД с помощью jdbc 
может кто-то знает решение этой задачи ?  Может есть готовое опен сорс (в виде жарки  smile ) решение для этого ? 


Для примера, вот небольшой кусок из огромного файла
Код

declare
    c   integer;
begin
    select count(*) into c from user_tab_columns where table_name = 'CONTRACTOR' and column_name = 'FINACCAPPLICATIONSERVERPORT';
    if c = 0
    then
        EXECUTE IMMEDIATE 'alter table contractor add finaccapplicationserverport varchar2(30) null';
    end if;
end;
/


/* ms 06.10.2009 */
declare
    c   integer;
begin
    select count(*) into c from user_tab_columns where table_name = 'CONTRACTOR' and column_name = 'CONTRSETTLSUMSTYLESHEET';
    if c = 0
    then
        EXECUTE IMMEDIATE 'ALTER TABLE CONTRACTOR ADD CONTRSETTLSUMSTYLESHEET VARCHAR2(255)     NULL';
    end if;
end;
/

/* wk 06.10.2009 */
declare
    c   integer;
begin
    select count(*) into c from user_tab_columns where table_name = 'ONLINEADFORMAT' and column_name = 'RELEVANTTOADSERVER';
    if c = 0
    then
        EXECUTE IMMEDIATE 'ALTER TABLE ONLINEADFORMAT ADD RELEVANTTOADSERVER NUMBER(1) DEFAULT 0 NOT NULL';   
    end if;
end;
/

declare
    c   integer;
begin
    select count(*) into c from user_tab_columns where table_name = 'SCHEDULECOMPOSITION' and column_name = 'SCHEDULEDFORADSERVER';
    if c = 0
    then
        EXECUTE IMMEDIATE 'ALTER TABLE SCHEDULECOMPOSITION ADD SCHEDULEDFORADSERVER NUMBER(1) DEFAULT 0 NOT NULL';   
    end if;
end;
/

CREATE OR REPLACE VIEW READONLYONLINEADLISTENTRY 
(
    CONTEXTID,
    PRODUCTIONDATE,
    ID,
    SCHEDCOMPFOROAID,
    EDITIONID,
    ELEMENTARYEDITIONID,
    COMMERCIALOBJECTID,
    ORDERHEADERID,
    ORDERCODE,
    ORDERSTATUSID,
    INITIALSTATUSID,
    ONLINEADID,
    ONLINEADSTATUSID,
    CATCHWORD,
    ORDERERID,
    INSERTERID,
    PAYERID,
    FOREIGNORDERCODE,
    ORDERERBUSINESSPARTNERNUMBER,
    SPECIALID1,
    SPECIALID2,
    NETPRICEFORSCHEDCOMP,
    ORDERERLEGALENTITYID,
    ORDERERBUSINESSLINEID,
    ORDERERNAME,
    ORDERERFORENAME,
    INSERTERLEGALENTITYID,
    INSERTERBUSINESSLINEID,
    INSERTERNAME,
    INSERTERFORENAME,
    ANNOTATION,
    SALESREP1NAME,
    NETPRICEINCLUDINGVAT,
    ADTAX,
    ONLINEADCODE,
    CONTRACTDISCOUNT,
    AGENCYCOMMISSION,
    SPECIALDISCOUNT,
    DEFAULTCHARGESEMANTICTYPE,
    GROOVYSCRIPT,
    DYNAMICRATEDISCOUNT,
    VOLUMEDISCOUNT,
    COMBINATIONDISCOUNT,
    ADBOXNUMBERFEE,
    ADCLASSDISCOUNT,
    SCHEDCOMPSTATUSID,
    BILLINGSTATUSID,
    SPLITPERCENTAGE,
    CREATIONUSER,
    AVERAGEREVENUE,
    SALESCOMMISSION,
    SALESCOMMISSIONPERCENTAGE,
    COSTCENTER,
    COSTCENTERMANUALLYSET,
    RATEPRICEFORSCHEDCOMP,
    RATEACCORDDIFF,
    RATEACCORDPERCENT,
    INVOICETEXT,
    ASCERTAINEDPRICEPERUNIT,
    TOTALDISCOUNTAMOUNTNET,
    REFERENCEDATE,
    BOOKEDEDITIONID,
    BOOKEDCOMMERCIALOBJECTID,
    LEGALENTITYTYPE,
    NETPRICEOVERRIDDEN,
    COMMENTPD,
    BASECONTRACTDISCOUNT,
    BASEAGENCYCOMMISSION,
    BASESPECIALDISCOUNT,
    BASEDEFAULTCHARGESEMANTICTYPE,
    BASEGROOVYSCRIPT,
    BASEDYNAMICRATEDISCOUNT,
    BASEVOLUMEDISCOUNT,
    BASECOMBINATIONDISCOUNT,
    BASEADBOXNUMBERFEE,
    BASEADCLASSDISCOUNT,
    COMMENTPDLOWER,
    USEDPRICEPERUNIT,
    PRICEFORSCHEDCOMP,
    AGENCYTYPE,
    POSITIONNUMBER,
    LOCKINGUSER,
    LOCKINGTIME,
    PAYMENTMETHODID,
    COMMENTSC,
    ORDERERCORPORATEGROUPMOTHER,
    INSERTERCORPORATEGROUPMOTHER,
    BILLINGLOCKREASONS,
    BOOKEDQUANTITY,
    ACTUALQUANTITY,
    ACTUALCLICKRATE,
    BOOKINGSHARE,
    ONLINESTARTDATE,
    ONLINEENDDATE,
    ONLFILESIZE,
    ONLLINKURL,
    ONLCLICKTEXT,
    ONLALTERNTEXT,
    BOOKINGTYPE,
    ADTYPE,
    INSERTERNUMBER,
    AGENT2NAME,
    AGENT2NO,
    AGENT2CORPGROUPMOTHER,
    AGENT3NAME,
    AGENT3NO,
    AGENT3CORPGROUPMOTHER,
    ORDERERMAILADDRESS,
    INSERTERMAILADDRESS,
    SERVICEPACKAGE,
    PLACEMENT,
    BASEAUCTIONDISCOUNT,
    AUCTIONDISCOUNT,
    BASEAMOUNTSURCHARGE,
    AMOUNTSURCHARGE,
    BONUSDAY,
    SCHEDULEDFORADSERVER
)
AS
select  oh.contextid,
        sc.productiondate,
        sc.schedulecompositionid id,
        sc.schedulecompositionid schedcompforfsid,
        nvl(sc.AdEditionCombinationId, sc.BookedEditionId) editionid,
        sc.BookedEditionId elementaryEditionId,
        sc.commercialobjectid,
        oh.orderid orderheaderid,
        oh.ordercode,
        oh.statusId,
        oh.initialStatus,
        pd.productiondetailid onlineadid,
            --pd.statusid foreignsupplStatusId,
        /**/ pd.statusid ONLINEADSTATUSID,
        pd.catchword,
        oh.ordererid,
        oh.inserterid,
        sc.payerid,
        oh.FOREIGNORDERCODE,
        orderer.businesspartnernumber ordererbusinesspartnernumber,
        orderer.specialid1,
        orderer.specialid2,
        sc.netpriceforschedcomp,
        orderer_le.legalentityid ordererlegalentityid,
        orderer_le.mainbusinesslineid ORDERERBUSINESSLINEID,
        orderer_le.name orderername,
        orderer_le.forename ordererforename,
        inserter_le.legalentityid inserterlegalentityid,
        inserter_le.mainbusinesslineid INSERTERBUSINESSLINEID,
        inserter_le.name insertername,
        inserter_le.forename inserterforename,
        pd.annotation,
        get_srep_name_for_sc(sc.schedulecompositionid),
        sc.NETPRICEINCLUDINGVAT,
        sc.ADTAX,
            --pd.productiondetailcode foreignsupplcode,
        /**/ pd.productiondetailcode ONLINEADCODE,
        get_discount_value_for_sc(sc.schedulecompositionid, 1),
            --get_discount_value_for_sc(sc.schedulecompositionid, 16),
        get_discount_value_for_sc(sc.schedulecompositionid, 2),
        get_discount_value_for_sc(sc.schedulecompositionid, 4),
        get_discount_value_for_sc(sc.schedulecompositionid, 5),
        get_discount_value_for_sc(sc.schedulecompositionid, 6),
            --get_discount_value_for_sc(sc.schedulecompositionid, 7),
        get_discount_value_for_sc(sc.schedulecompositionid, 8),
            --get_discount_value_for_sc(sc.schedulecompositionid, 9),
        get_discount_value_for_sc(sc.schedulecompositionid, 12),
        /**/ get_discount_value_for_sc(sc.schedulecompositionid, 3),
        /**/ get_discount_value_for_sc(sc.schedulecompositionid, 10),
        /**/ get_discount_value_for_sc(sc.schedulecompositionid, 13),
        sc.STATUSFORSCHEDCOMPID,
        sc.billingstatusid,
        sc.splitpercentage,
        sc.CREATIONUSER,
            --pd.FOREIGNSUPPLEMENTTYPEID,
        oh.AVERAGEREVENUE,
        sc.salescommission,
        get_sales_comm_perc_for_sc (sc.schedulecompositionid),
        sc.costcenter,
        sc.costcentermanuallyset,
        sc.ratepriceforschedcomp,
        0,
        0,
        sc.invoicetext,
        sc.ASCERTAINEDPRICEPERUNIT,
        sc.totalDiscountAmountNet,
        sc.referencedate,
        sc.BookedEditionId,
        co.commercialobjectid,
        orderer_le.LEGALENTITYTYPE,
        sc.netpriceoverridden,
        pd.commentpd,
        get_discount_basevalue_for_sc(sc.schedulecompositionid, 1),
            --get_discount_basevalue_for_sc(sc.schedulecompositionid, 16),
        get_discount_basevalue_for_sc(sc.schedulecompositionid, 2),
        get_discount_basevalue_for_sc(sc.schedulecompositionid, 4),
        get_discount_basevalue_for_sc(sc.schedulecompositionid, 5),
        get_discount_basevalue_for_sc(sc.schedulecompositionid, 6),
            --get_discount_basevalue_for_sc(sc.schedulecompositionid, 7),
        get_discount_basevalue_for_sc(sc.schedulecompositionid, 8),
            --get_discount_basevalue_for_sc(sc.schedulecompositionid, 9),
        get_discount_basevalue_for_sc(sc.schedulecompositionid, 12),
        /**/ get_discount_basevalue_for_sc(sc.schedulecompositionid, 3),
        /**/ get_discount_basevalue_for_sc(sc.schedulecompositionid, 10),
        /**/ get_discount_basevalue_for_sc(sc.schedulecompositionid, 13),
        nvl(pd.commentpdlower, lower(pd.commentpd)),
        sc.USEDPRICEPERUNIT,
        sc.PRICEFORSCHEDCOMP,
        orderer.agencyType,
        get_pos_no(NVL(sc.relatedmaincombinationpartid, sc.schedulecompositionid)),
        (select lo.usercode from lockedobject lo where lo.OBJECTID = oh.orderid),
        (select lo.creationtimestamp from lockedobject lo where lo.OBJECTID = oh.orderid),
        oh.paymentmethodid,
        sc.commentsc,
        get_corp_group_mother(oh.ordererid),
        get_corp_group_mother(oh.inserterid),
        sc.billinglockreasons,
        /**/ sc.bookedquantity,
        /**/ sc.actualquantity,
        /**/ sc.actualclickrate,
        /**/ sc.bookingshare,
        /**/ sc.productiondate,
        /**/ sc.onlineenddate,
        /**/ pd.onlfilesize,
        /**/ pd.onllinkurl,
        /**/ pd.onlclicktext,
        /**/ pd.onlalterntext,
        /**/ sc.chargingunit,
        /**/ pd.adtype,
        inserter.businesspartnernumber,
        (case when oh.agent2Id is not null
             then (  select name from legalentity lex, businesspartner bpx
                     where bpx.legalentityid = lex.legalentityid
                     and bpx.businesspartnerid = oh.agent2Id )
             else null
           end) agent2Name,
           (case when oh.agent2Id is not null
             then (  select bp.businesspartnernumber from businesspartner bp
                     where bp.businesspartnerid = oh.agent2Id )
             else null
           end) agent2No,
            get_corp_group_mother(oh.agent2id) AGENT2CORPGROUPMOTHER,
           (case when oh.agent3Id is not null
             then (  select name from legalentity lex, businesspartner bpx
                     where bpx.legalentityid = lex.legalentityid
                     and bpx.businesspartnerid = oh.agent3Id )
             else null
           end) agent3Name,
           (case when oh.agent3Id is not null
             then (  select businesspartnernumber from businesspartner bpx
                     where bpx.businesspartnerid = oh.agent3Id )
             else null
         end) agent3No,
        get_corp_group_mother(oh.agent3id) AGENT3CORPGROUPMOTHER,
    get_mainmailaddress(oh.ordererid) ORDERERMAILADDRESS,
    get_mainmailaddress(oh.inserterid) INSERTERMAILADDRESS,
    get_service_package_for_sc(sc.schedulecompositionid),
    get_string_onlplm_for_sc (sc.schedulecompositionid) PLACEMENT,
    get_discount_basevalue_for_sc(sc.schedulecompositionid, 17) BASEAUCTIONDISCOUNT,
    get_discount_value_for_sc(sc.schedulecompositionid, 17) AUCTIONDISCOUNT,
    get_discount_basevalue_for_sc(sc.schedulecompositionid, 18) BASEAMOUNTSURCHARGE,
    get_discount_value_for_sc(sc.schedulecompositionid, 18) AMOUNTSURCHARGE,
     sc.BONUSDAY,
     nvl(sc.SCHEDULEDFORADSERVER, 0) SCHEDULEDFORADSERVER
from    schedulecomposition sc, orderheader oh, productiondetail pd, commercialobjectpart co,
        businesspartner inserter, businesspartner orderer, legalentity inserter_le, legalentity orderer_le
where   sc.orderheaderid = oh.orderid
    and sc.classid = 4
    and sc.splitoriginalscid = sc.schedulecompositionid
    and sc.productiondetailid = pd.productiondetailid
    and sc.BookedEditionId = co.id
    and oh.inserterid = inserter.businesspartnerid (+)
    and inserter_le.legalentityid (+) = inserter.legalentityid
    and oh.ordererid = orderer.businesspartnerid
    and orderer_le.legalentityid = orderer.legalentityid
/


Как бы вы его считывали, парсири и выполняли ?  
Подскажите пажалста smile 

Важное замечание: 
как можно видеть из кода, нужна парсилка, умеющая работать с PL/SQL

Это сообщение отредактировал(а) Samotnik - 16.11.2009, 19:47
PM MAIL   Вверх
Samotnik
Дата 16.11.2009, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



никто таким не занимался ? 

Сформулирую еще раз: 

Есть БД, уже сформированная. Есть файлик  *.sql, в который каждый день кто-то вносит дополнения. Так вот нужно написать метод или класс, который будет читать этот файл, выбирать из него скрипты и запускать их. (пример скриптов, я выложил постом выше) smile   И еще одно замечание - скрипты в этом файле на языка PL/SQL
Подкиньте пажалста идеи, или если есть опен сорс решение, то будет вообще мега круто smile 
PM MAIL   Вверх
garbuz
Дата 16.11.2009, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 3
Всего: 11



Samotnik, маловато деталей.
Кто-то живой пишет этот файл, или он тоже генерится?
Какие именно куски должны выбираться из файла? только новые? Или какие-то особенные?
PM MAIL   Вверх
Samotnik
Дата 16.11.2009, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



Цитата(garbuz @  16.11.2009,  23:28 Найти цитируемый пост)
Кто-то живой пишет этот файл, или он тоже генерится?
Какие именно куски должны выбираться из файла? только новые? Или какие-то особенные? 

да, пишут его люди. 
Есть БД, есть большой проект. 
Но каждый день, кому-то нужны маленькие изменения, где-то таблицу подправить, где-то поле отредактировать. И каждый пишет скриптики, примерно такого рода: 

Код

/*  Человек номер один сделал это :   16.11.2009*/
declare
    c   integer;
begin
    select count(*) into c from user_tab_columns where table_name = 'CONTRACTOR' and column_name = 'FINACCAPPLICATIONSERVERPORT';
    if c = 0
    then
        EXECUTE IMMEDIATE 'alter table contractor add finaccapplicationserverport varchar2(30) null';
    end if;
end;
/
/*  Человек номер два  сделал это :   17.11.2009*/
declare
    c   integer;
begin
    select count(*) into c from user_tab_columns where table_name = 'CONTRACTOR' and column_name = 'CONTRSETTLSUMSTYLESHEET';
    if c = 0
    then
        EXECUTE IMMEDIATE 'ALTER TABLE CONTRACTOR ADD CONTRSETTLSUMSTYLESHEET VARCHAR2(255)     NULL';
    end if;
end;
/

/*  Человек номер три   сделал это :   17.11.2009*/
declare
    c   integer;
begin
    select count(*) into c from user_tab_columns where table_name = 'ONLINEADFORMAT' and column_name = 'RELEVANTTOADSERVER';
    if c = 0
    then
        EXECUTE IMMEDIATE 'ALTER TABLE ONLINEADFORMAT ADD RELEVANTTOADSERVER NUMBER(1) DEFAULT 0 NOT NULL';   
    end if;
end;
/


/*  Человек номер четыре  сделал это :   18.11.2009*/
declare
    c   integer;
begin
    select count(*) into c from user_tab_columns where table_name = 'SCHEDULECOMPOSITION' and column_name = 'SCHEDULEDFORADSERVER';
    if c = 0
    then
        EXECUTE IMMEDIATE 'ALTER TABLE SCHEDULECOMPOSITION ADD SCHEDULEDFORADSERVER NUMBER(1) DEFAULT 0 NOT NULL';   
    end if;
end;
/


/*  Человек номер пять   сделал это :   20.11.2009*/
CREATE OR REPLACE VIEW READONLYONLINEADLISTENTRY 
(
    CONTEXTID,
    PRODUCTIONDATE,
    ID,
    SCHEDCOMPFOROAID,
    EDITIONID,
    ELEMENTARYEDITIONID,
    COMMERCIALOBJECTID,
    ORDERHEADERID,
    ORDERCODE,
    ORDERSTATUSID,
    INITIALSTATUSID,
    ONLINEADID,
    ONLINEADSTATUSID,
    CATCHWORD,
    ORDERERID,
    INSERTERID,
    PAYERID,
    FOREIGNORDERCODE,
    ORDERERBUSINESSPARTNERNUMBER,
    SPECIALID1,
    SPECIALID2,
    NETPRICEFORSCHEDCOMP,
    ORDERERLEGALENTITYID,
    ORDERERBUSINESSLINEID,
    ORDERERNAME,
    ORDERERFORENAME,
    INSERTERLEGALENTITYID,
    INSERTERBUSINESSLINEID,
    INSERTERNAME,
    INSERTERFORENAME,
    ANNOTATION,
    SALESREP1NAME,
    NETPRICEINCLUDINGVAT,
    ADTAX,
    ONLINEADCODE,
    CONTRACTDISCOUNT,
    AGENCYCOMMISSION,
    SPECIALDISCOUNT,
    DEFAULTCHARGESEMANTICTYPE,
    GROOVYSCRIPT,
    DYNAMICRATEDISCOUNT,
    VOLUMEDISCOUNT,
    COMBINATIONDISCOUNT,
    ADBOXNUMBERFEE,
    ADCLASSDISCOUNT,
    SCHEDCOMPSTATUSID,
    BILLINGSTATUSID,
    SPLITPERCENTAGE,
    CREATIONUSER,
    AVERAGEREVENUE,
    SALESCOMMISSION,
    SALESCOMMISSIONPERCENTAGE,
    COSTCENTER,
    COSTCENTERMANUALLYSET,
    RATEPRICEFORSCHEDCOMP,
    RATEACCORDDIFF,
    RATEACCORDPERCENT,
    INVOICETEXT,
    ASCERTAINEDPRICEPERUNIT,
    TOTALDISCOUNTAMOUNTNET,
    REFERENCEDATE,
    BOOKEDEDITIONID,
    BOOKEDCOMMERCIALOBJECTID,
    LEGALENTITYTYPE,
    NETPRICEOVERRIDDEN,
    COMMENTPD,
    BASECONTRACTDISCOUNT,
    BASEAGENCYCOMMISSION,
    BASESPECIALDISCOUNT,
    BASEDEFAULTCHARGESEMANTICTYPE,
    BASEGROOVYSCRIPT,
    BASEDYNAMICRATEDISCOUNT,
    BASEVOLUMEDISCOUNT,
    BASECOMBINATIONDISCOUNT,
    BASEADBOXNUMBERFEE,
    BASEADCLASSDISCOUNT,
    COMMENTPDLOWER,
    USEDPRICEPERUNIT,
    PRICEFORSCHEDCOMP,
    AGENCYTYPE,
    POSITIONNUMBER,
    LOCKINGUSER,
    LOCKINGTIME,
    PAYMENTMETHODID,
    COMMENTSC,
    ORDERERCORPORATEGROUPMOTHER,
    INSERTERCORPORATEGROUPMOTHER,
    BILLINGLOCKREASONS,
    BOOKEDQUANTITY,
    ACTUALQUANTITY,
    ACTUALCLICKRATE,
    BOOKINGSHARE,
    ONLINESTARTDATE,
    ONLINEENDDATE,
    ONLFILESIZE,
    ONLLINKURL,
    ONLCLICKTEXT,
    ONLALTERNTEXT,
    BOOKINGTYPE,
    ADTYPE,
    INSERTERNUMBER,
    AGENT2NAME,
    AGENT2NO,
    AGENT2CORPGROUPMOTHER,
    AGENT3NAME,
    AGENT3NO,
    AGENT3CORPGROUPMOTHER,
    ORDERERMAILADDRESS,
    INSERTERMAILADDRESS,
    SERVICEPACKAGE,
    PLACEMENT,
    BASEAUCTIONDISCOUNT,
    AUCTIONDISCOUNT,
    BASEAMOUNTSURCHARGE,
    AMOUNTSURCHARGE,
    BONUSDAY,
    SCHEDULEDFORADSERVER
)
AS
select  oh.contextid,
        sc.productiondate,
        sc.schedulecompositionid id,
        sc.schedulecompositionid schedcompforfsid,
        nvl(sc.AdEditionCombinationId, sc.BookedEditionId) editionid,
        sc.BookedEditionId elementaryEditionId,
        sc.commercialobjectid,
        oh.orderid orderheaderid,
        oh.ordercode,
        oh.statusId,
        oh.initialStatus,
        pd.productiondetailid onlineadid,
            --pd.statusid foreignsupplStatusId,
        /**/ pd.statusid ONLINEADSTATUSID,
        pd.catchword,
        oh.ordererid,
        oh.inserterid,
        sc.payerid,
        oh.FOREIGNORDERCODE,
        orderer.businesspartnernumber ordererbusinesspartnernumber,
        orderer.specialid1,
        orderer.specialid2,
        sc.netpriceforschedcomp,
        orderer_le.legalentityid ordererlegalentityid,
        orderer_le.mainbusinesslineid ORDERERBUSINESSLINEID,
        orderer_le.name orderername,
        orderer_le.forename ordererforename,
        inserter_le.legalentityid inserterlegalentityid,
        inserter_le.mainbusinesslineid INSERTERBUSINESSLINEID,
        inserter_le.name insertername,
        inserter_le.forename inserterforename,
        pd.annotation,
        get_srep_name_for_sc(sc.schedulecompositionid),
        sc.NETPRICEINCLUDINGVAT,
        sc.ADTAX,
            --pd.productiondetailcode foreignsupplcode,
        /**/ pd.productiondetailcode ONLINEADCODE,
        get_discount_value_for_sc(sc.schedulecompositionid, 1),
            --get_discount_value_for_sc(sc.schedulecompositionid, 16),
        get_discount_value_for_sc(sc.schedulecompositionid, 2),
        get_discount_value_for_sc(sc.schedulecompositionid, 4),
        get_discount_value_for_sc(sc.schedulecompositionid, 5),
        get_discount_value_for_sc(sc.schedulecompositionid, 6),
            --get_discount_value_for_sc(sc.schedulecompositionid, 7),
        get_discount_value_for_sc(sc.schedulecompositionid, 8),
            --get_discount_value_for_sc(sc.schedulecompositionid, 9),
        get_discount_value_for_sc(sc.schedulecompositionid, 12),
        /**/ get_discount_value_for_sc(sc.schedulecompositionid, 3),
        /**/ get_discount_value_for_sc(sc.schedulecompositionid, 10),
        /**/ get_discount_value_for_sc(sc.schedulecompositionid, 13),
        sc.STATUSFORSCHEDCOMPID,
        sc.billingstatusid,
        sc.splitpercentage,
        sc.CREATIONUSER,
            --pd.FOREIGNSUPPLEMENTTYPEID,
        oh.AVERAGEREVENUE,
        sc.salescommission,
        get_sales_comm_perc_for_sc (sc.schedulecompositionid),
        sc.costcenter,
        sc.costcentermanuallyset,
        sc.ratepriceforschedcomp,
        0,
        0,
        sc.invoicetext,
        sc.ASCERTAINEDPRICEPERUNIT,
        sc.totalDiscountAmountNet,
        sc.referencedate,
        sc.BookedEditionId,
        co.commercialobjectid,
        orderer_le.LEGALENTITYTYPE,
        sc.netpriceoverridden,
        pd.commentpd,
        get_discount_basevalue_for_sc(sc.schedulecompositionid, 1),
            --get_discount_basevalue_for_sc(sc.schedulecompositionid, 16),
        get_discount_basevalue_for_sc(sc.schedulecompositionid, 2),
        get_discount_basevalue_for_sc(sc.schedulecompositionid, 4),
        get_discount_basevalue_for_sc(sc.schedulecompositionid, 5),
        get_discount_basevalue_for_sc(sc.schedulecompositionid, 6),
            --get_discount_basevalue_for_sc(sc.schedulecompositionid, 7),
        get_discount_basevalue_for_sc(sc.schedulecompositionid, 8),
            --get_discount_basevalue_for_sc(sc.schedulecompositionid, 9),
        get_discount_basevalue_for_sc(sc.schedulecompositionid, 12),
        /**/ get_discount_basevalue_for_sc(sc.schedulecompositionid, 3),
        /**/ get_discount_basevalue_for_sc(sc.schedulecompositionid, 10),
        /**/ get_discount_basevalue_for_sc(sc.schedulecompositionid, 13),
        nvl(pd.commentpdlower, lower(pd.commentpd)),
        sc.USEDPRICEPERUNIT,
        sc.PRICEFORSCHEDCOMP,
        orderer.agencyType,
        get_pos_no(NVL(sc.relatedmaincombinationpartid, sc.schedulecompositionid)),
        (select lo.usercode from lockedobject lo where lo.OBJECTID = oh.orderid),
        (select lo.creationtimestamp from lockedobject lo where lo.OBJECTID = oh.orderid),
        oh.paymentmethodid,
        sc.commentsc,
        get_corp_group_mother(oh.ordererid),
        get_corp_group_mother(oh.inserterid),
        sc.billinglockreasons,
        /**/ sc.bookedquantity,
        /**/ sc.actualquantity,
        /**/ sc.actualclickrate,
        /**/ sc.bookingshare,
        /**/ sc.productiondate,
        /**/ sc.onlineenddate,
        /**/ pd.onlfilesize,
        /**/ pd.onllinkurl,
        /**/ pd.onlclicktext,
        /**/ pd.onlalterntext,
        /**/ sc.chargingunit,
        /**/ pd.adtype,
        inserter.businesspartnernumber,
        (case when oh.agent2Id is not null
             then (  select name from legalentity lex, businesspartner bpx
                     where bpx.legalentityid = lex.legalentityid
                     and bpx.businesspartnerid = oh.agent2Id )
             else null
           end) agent2Name,
           (case when oh.agent2Id is not null
             then (  select bp.businesspartnernumber from businesspartner bp
                     where bp.businesspartnerid = oh.agent2Id )
             else null
           end) agent2No,
            get_corp_group_mother(oh.agent2id) AGENT2CORPGROUPMOTHER,
           (case when oh.agent3Id is not null
             then (  select name from legalentity lex, businesspartner bpx
                     where bpx.legalentityid = lex.legalentityid
                     and bpx.businesspartnerid = oh.agent3Id )
             else null
           end) agent3Name,
           (case when oh.agent3Id is not null
             then (  select businesspartnernumber from businesspartner bpx
                     where bpx.businesspartnerid = oh.agent3Id )
             else null
         end) agent3No,
        get_corp_group_mother(oh.agent3id) AGENT3CORPGROUPMOTHER,
    get_mainmailaddress(oh.ordererid) ORDERERMAILADDRESS,
    get_mainmailaddress(oh.inserterid) INSERTERMAILADDRESS,
    get_service_package_for_sc(sc.schedulecompositionid),
    get_string_onlplm_for_sc (sc.schedulecompositionid) PLACEMENT,
    get_discount_basevalue_for_sc(sc.schedulecompositionid, 17) BASEAUCTIONDISCOUNT,
    get_discount_value_for_sc(sc.schedulecompositionid, 17) AUCTIONDISCOUNT,
    get_discount_basevalue_for_sc(sc.schedulecompositionid, 18) BASEAMOUNTSURCHARGE,
    get_discount_value_for_sc(sc.schedulecompositionid, 18) AMOUNTSURCHARGE,
     sc.BONUSDAY,
     nvl(sc.SCHEDULEDFORADSERVER, 0) SCHEDULEDFORADSERVER
from    schedulecomposition sc, orderheader oh, productiondetail pd, commercialobjectpart co,
        businesspartner inserter, businesspartner orderer, legalentity inserter_le, legalentity orderer_le
where   sc.orderheaderid = oh.orderid
    and sc.classid = 4
    and sc.splitoriginalscid = sc.schedulecompositionid
    and sc.productiondetailid = pd.productiondetailid
    and sc.BookedEditionId = co.id
    and oh.inserterid = inserter.businesspartnerid (+)
    and inserter_le.legalentityid (+) = inserter.legalentityid
    and oh.ordererid = orderer.businesspartnerid
    and orderer_le.legalentityid = orderer.legalentityid
/

/*   Человек номер  стотыщпиццот сделает еще сотню коммитов сюда*/


Задумка ясна ? 
Есть файлик sql  в который все желающие заносят изменения. Файл находится под репозиторием, т.е. любой чел обновит этот файлик и исполнит у себя недостающие куски кода, для того чтобы весь проект работал. В данный момент я делаю это вручную - мержил свой файл с последней версией из репозитория, брал эти скрипты и исполнял в своей локальной бд.  Теперь этот процесс нужно автоматизировать, нужно, чтобы написанный мною код - брал этот файлик, каким то образом его парсил (разбивал на коммит каждого человека) и исполнял его в локальной бд.   Легко заметить, что в sql  коде есть комментарии каждого чела, который заносит туда свои изменения, и дата, когда он это сделал.  Исполняемый код  - разный. Если какая-то проверка,то есть слова declare, begin, end  и заканчивается символом  "слэш" / Но есть код, где просто sql  вставки , типа  update, select, etc...
Поэтому, самому парсить сложно, нужна очень большая регулярка. и пришла мне мысль, что кто-то до меня таким занимался, и есть уже жарка, которая поможет решить проблему.  Нужно каким-то образом, прочитать этот файл, и брать из него куски, начинающиесй с комментариев и заканивающимся либо слешем /   либо еще чем - нибудь smile  (я думаю, что всегда будет оканчиваться слешем, поэтому задача возможно упроститься) 

теперь ясно, что нужно ? 
Нужно прочитать файл - разбить его на скриптики каждого человека, что их туда занес (начинаются они с комментариев, заканчиваются символом слеш /) и исполнить их в локальной бд, через обычный jdbc
 smile 
PM MAIL   Вверх
garbuz
Дата 17.11.2009, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 3
Всего: 11



Samotnik, задача ясна. 
А что мешает разбивать на токены по 
Код

/*  Человек номер пять   сделал это :   20.11.2009*/


А еще просто договориться, чтобы все ставили либо перед либо после какой-нить токен, по которому ты мог разбивать большой файл на части. Типа
Код

/******************/


PM MAIL   Вверх
Samotnik
Дата 17.11.2009, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



Цитата(garbuz @  17.11.2009,  00:33 Найти цитируемый пост)
А что мешает разбивать на токены по 

ну это крайний вариант smile   нужно что-то универсальное.  Т.к. не все и не всегда ставят именно так. 
Цитата(garbuz @  17.11.2009,  00:33 Найти цитируемый пост)
А еще просто договориться

К сожалению этот вариант отметается, т.к. нету таковой возможности, не я должен разработчиков под себя подстраивать, а наоборот - я должен написать что-то универсальное, что должно работать. 
нашел, кстати парсер zsql нужно будет с ним поразбираться . может подойдет ... 
PM MAIL   Вверх
ivanovpv
Дата 17.11.2009, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Варвар
**


Профиль
Группа: Участник
Сообщений: 639
Регистрация: 26.1.2005
Где: Москва

Репутация: 4
Всего: 28



Нд-а-а-а жестокая задача... Ладно бы речь шла о парсере строки, но тут фактически речь идет о полноценном компиляторе: разбор управляющих конструкций, переменных, параметров и проч.

Я бы пошел 2-мя путями:
а) Поискал бы какой-нить парсер PL/SQL в сети что-то похожее болтается
б) Попробовал бы что-то наподобие antlr/lex/yacc - универсальных лексических анализаторов с задаваемой грамматикой (неплохая подборка здесь) и генерирующих исходный текст компилятора/парсера. Правда там вопрос станет о грамматике PL/SQL - составление коего на языке анализатора само по себе непростая задача. Надо надеяться, что всемогущий гугль также здесь поможет. По крайней мере я находил в свое время грамматику фортрана для ANTLR в сети.


--------------------
Aut viam inveniam aut faciam
PM MAIL Skype   Вверх
avvo
Дата 17.11.2009, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 11.9.2007

Репутация: нет
Всего: 4



Это ведь файл в формате SQLPlus, т.е. файл с выражениями SQL или PL/SQL разделенный слэшем в отдельной строке.
Надо просто разбить его на куски по слэшу (в отдельной строке!) и выполнять step by step.
Оракл всё прекрасно выполнит, и SQL и PL/SQL, ему пофиг. Главное, после SQL выражений не забывать commit делать.

Ну и еще надо как-то запоминать, где остановились, на конкретном экземпляре БД. Или получать из репозитория дифы.
Файл, он же только расти может, если я правильно понял.
PM MAIL   Вверх
Samotnik
Дата 17.11.2009, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



Цитата(avvo @  17.11.2009,  10:37 Найти цитируемый пост)
Это ведь файл в формате SQLPlus, т.е. файл с выражениями SQL или PL/SQL разделенный слэшем в отдельной строке.
Надо просто разбить его на куски по слэшу (в отдельной строке!) и выполнять step by step.
Оракл всё прекрасно выполнит, и SQL и PL/SQL, ему пофиг. Главное, после SQL выражений не забывать commit делать.

Хорошо, я тоже об этом думал - чиать до слеша, но ведь в комментариях тоже слешы есть smile и как быть в этом случае ?
PM MAIL   Вверх
avvo
Дата 17.11.2009, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 11.9.2007

Репутация: нет
Всего: 4



Цитата(Samotnik @ 17.11.2009,  10:43)

Хорошо, я тоже об этом думал - чиать до слеша, но ведь в комментариях тоже слешы есть smile и как быть в этом случае ?

В комментариях не должно быть слэша в отдельной строке. Иначе SQLPlus этот файл выплюнет.
PM MAIL   Вверх
Samotnik
Дата 17.11.2009, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



avvo,  хммм.....  ты прав smile 
сейчас весь файл проверю. Впринципе это вариант smile Спасибо (предварительно ^__^)

Добавлено через 12 минут и 17 секунд
avvo,  не катит :(((
нашел скриптовые вставки, которые просто что-то удаляют или добавляют 
Код

/* Иванов Мван Мванович  16.11.2009 */

alter table selection drop column clientno;
alter table selection add contextid numeric(10) null;
alter table selection add constraint fk_selection_context
    foreign key (contextid) references context(id);  
create index idx_selection_context on selection(contextid);

update selection set contextid = (select id from context where rownum = 1);
commit;

alter table selection modify contextid not null;

alter table legalentity add businesspartnerid numeric(10) null;

alter table legalentity add constraint fk_legalentity_bp
    foreign key (businesspartnerid) references businesspartner(businesspartnerid) deferrable initially deferred;  
create index idx_legalentity_bp on legalentity(businesspartnerid);

update legalentity le set le.businesspartnerid = (select bp.businesspartnerid from businesspartner bp where bp.legalentityid = le.legalentityid) where
exists (select 1 from businesspartner bp where bp.legalentityid = le.legalentityid);

update legalentity le set le.businesspartnerid = (select p2bp.businesspartnerid from persontobp p2bp where p2bp.legalentityid = le.legalentityid) where
exists (select 1 from persontobp p2bp where p2bp.legalentityid = le.legalentityid);

commit;

как с этим быть ? 
моя читалка до слэша, этот код не выполнит ( 
PM MAIL   Вверх
avvo
Дата 17.11.2009, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 11.9.2007

Репутация: нет
Всего: 4



Цитата(Samotnik @ 17.11.2009,  11:01)
avvo,  хммм.....  ты прав smile 
сейчас весь файл проверю. Впринципе это вариант smile Спасибо (предварительно ^__^)

Добавлено @ 11:13
avvo,  не катит :(((
нашел скриптовые вставки, которые просто что-то удаляют или добавляют 
Код

/* Иванов Мван Мванович  16.11.2009 */

alter table selection drop column clientno;
alter table selection add contextid numeric(10) null;
alter table selection add constraint fk_selection_context
    foreign key (contextid) references context(id);  
create index idx_selection_context on selection(contextid);

update selection set contextid = (select id from context where rownum = 1);
commit;

alter table selection modify contextid not null;

alter table legalentity add businesspartnerid numeric(10) null;

alter table legalentity add constraint fk_legalentity_bp
    foreign key (businesspartnerid) references businesspartner(businesspartnerid) deferrable initially deferred;  
create index idx_legalentity_bp on legalentity(businesspartnerid);

update legalentity le set le.businesspartnerid = (select bp.businesspartnerid from businesspartner bp where bp.legalentityid = le.legalentityid) where
exists (select 1 from businesspartner bp where bp.legalentityid = le.legalentityid);

update legalentity le set le.businesspartnerid = (select p2bp.businesspartnerid from persontobp p2bp where p2bp.legalentityid = le.legalentityid) where
exists (select 1 from persontobp p2bp where p2bp.legalentityid = le.legalentityid);

commit;

как с этим быть ? 
моя читалка до слэша, этот код не выполнит (

Ну это не беда, ты каждое выражение заворачивай в declare begin ... end;

PM MAIL   Вверх
Samotnik
Дата 17.11.2009, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



Цитата(avvo @  17.11.2009,  11:29 Найти цитируемый пост)
Ну это не беда, ты каждое выражение заворачивай в declare begin ... end;

ясно ...
т.е. все сводится к тому, что готового решения нету ? 
Нужно самоу регулярки писать ? 
PM MAIL   Вверх
avvo
Дата 17.11.2009, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 11.9.2007

Репутация: нет
Всего: 4



Так ведь у тебя уже все работает. Просто каждое выражение заворачивай в declare begin end;
Даже если будет в итоге
Код

declare
begin
declare
begin
....
end;
end;


оракл это сожрет.

Есть iBatis ScriptRuner, но он тоже простой как карандаш.
Есть еще куча разных фронтендов для sql с опенсоурс тут, можно покопаться.
Опять же можно выполнить sqlplus со скриптом.
Но я думаю, что просто разделить по слэшу, обернуть и выполнить будет достаточно.
Главное тут, я думаю, придумать, как не выполнить лишнего, т.е. повторно не выполнять, то, что уже выполнено.
PM MAIL   Вверх
LSD
Дата 17.11.2009, 12:01 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


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.
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1469 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.