Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > sql Parser


Автор: Samotnik 16.11.2009, 19:38
Привет ! 
Задача, вроде на первый взгляд тривиальная, но догодаться я не могу как ее решить 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, 23:19
никто таким не занимался ? 

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

Есть БД, уже сформированная. Есть файлик  *.sql, в который каждый день кто-то вносит дополнения. Так вот нужно написать метод или класс, который будет читать этот файл, выбирать из него скрипты и запускать их. (пример скриптов, я выложил постом выше) smile   И еще одно замечание - скрипты в этом файле на языка PL/SQL
Подкиньте пажалста идеи, или если есть опен сорс решение, то будет вообще мега круто smile 

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

Автор: Samotnik 16.11.2009, 23:55
Цитата(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 

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

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


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

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


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

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

К сожалению этот вариант отметается, т.к. нету таковой возможности, не я должен разработчиков под себя подстраивать, а наоборот - я должен написать что-то универсальное, что должно работать. 
нашел, кстати парсер 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:37 Найти цитируемый пост)
Это ведь файл в формате SQLPlus, т.е. файл с выражениями SQL или PL/SQL разделенный слэшем в отдельной строке.
Надо просто разбить его на куски по слэшу (в отдельной строке!) и выполнять step by step.
Оракл всё прекрасно выполнит, и SQL и PL/SQL, ему пофиг. Главное, после SQL выражений не забывать commit делать.

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

Автор: avvo 17.11.2009, 10:49
Цитата(Samotnik @ 17.11.2009,  10:43)

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

В комментариях не должно быть слэша в отдельной строке. Иначе SQLPlus этот файл выплюнет.

Автор: Samotnik 17.11.2009, 11:01
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;

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

Автор: avvo 17.11.2009, 11:29
Цитата(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;

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

ясно ...
т.е. все сводится к тому, что готового решения нету ? 
Нужно самоу регулярки писать ? 

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

declare
begin
declare
begin
....
end;
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
Цитата(LSD @  17.11.2009,  12:01 Найти цитируемый пост)
Просто вызови с помощью Runtime.exec() SQL*Plus и передай ему в качестве параметра этот файл. 

тоже думал, но а если нету  SQL plus  на компе  ?

Добавлено через 24 секунды
поэтому и хотелось через jdbc 

Автор: Samotnik 17.11.2009, 13:29
2 LSD 
нашел еще круче утилитку 
с консоли запускается sqlplus  (c:\oracle\product\10.2.0\client_1\BIN\sqlplus.exe )
Если написать батник, то вприницпе проблема решится
НО 
как быть с ошибками ?  smile Что если ошибки будут в этом файле большом. Как можно вернуть текст этой ошибки на консоль ? Если бы вывести на экран строку с ошибкой и описанием, то проблемы ьыла бы решена  smile 

Автор: alex_nevolin 17.11.2009, 19:19
Цитата(Samotnik @ 17.11.2009,  13:29)
2 LSD 
нашел еще круче утилитку 
с консоли запускается sqlplus  (c:\oracle\product\10.2.0\client_1\BIN\sqlplus.exe )
Если написать батник, то вприницпе проблема решится
НО 
как быть с ошибками ?  smile Что если ошибки будут в этом файле большом. Как можно вернуть текст этой ошибки на консоль ? Если бы вывести на экран строку с ошибкой и описанием, то проблемы ьыла бы решена  smile

По сути это и есть SQL*Plus.
Т.е. на машине стоит Oracle Client. 
Его всегда можно запустить с параметрами для вывода ошибок и всего остального в файл. 
Также провертье есть ли у вас в файле команды коннекта к базе. Они могут быть в скрипте или передаваться праметрами.  Общий вид запуска sqlplus должен выглядеть как-то так:
Код

sqlplus /nolog @script.sql < properties.properties > logs.log

Далее можно считать файл лога logs.log
В любом случае самое сложное тут на мой взгляд определять что уже выполнялось из файла а что нет, иначе будут проблемы при повторном выполнении стейтментов из скрипта.
В целом думаю эту задачу нужно решать именно через Oracle Client a не через jdbc.

Автор: Samotnik 18.11.2009, 12:01
Цитата(LSD @  17.11.2009,  12:01 Найти цитируемый пост)
Просто вызови с помощью Runtime.exec() SQL*Plus и передай ему в качестве параметра этот файл. 

Как это сделать ?
Пытаюсь вот так 
Код

Runtime.getRuntime().exec( new String[] {"cmd", "cd c:/oracle/product/10.2.0/client_1/BIN",
                                                     "sqlplus login/[email protected]/testGO", "c:/DBUpd.sql"});

и ничего не происходит. Вообще. Ошибок нет, эксепшенов тоже нет, и результата тоже нет. 
 smile 

Автор: Samotnik 18.11.2009, 12:53
от так пишет ошибко
Код

Runtime.getRuntime().exec( new String[] {"sqlplus login/[email protected]/testGO", "c:\\DBUpd.sql"});            

Цитата

- java.io.IOException: Cannot run program "sqlplus login/[email protected]/testGO": CreateProcess error=2, The system cannot find the file specified
java.io.IOException: Cannot run program "sqlplus login/[email protected]/testGO": CreateProcess error=2, The system cannot find the file specified
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:459)
    at java.lang.Runtime.exec(Runtime.java:593)
    at java.lang.Runtime.exec(Runtime.java:466)
    at de.alfa.openMedia.adSuite.utils.JDBCUtil.main(JDBCUtil.java:316)
Caused by: java.io.IOException: CreateProcess error=2, The system cannot find the file specified
    at java.lang.ProcessImpl.create(Native Method)
    at java.lang.ProcessImpl.<init>(ProcessImpl.java:81)
    at java.lang.ProcessImpl.start(ProcessImpl.java:30)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:452)
    ... 3 more



Добавлено через 44 секунды
Хотя с командной строки 
от таким методом запускается без проблем
Код

sqlplus login/[email protected]/testGO

Автор: Samotnik 18.11.2009, 13:13
решено
Код

    public static void main(String argv[]) {
    try {
      String line;
      Process p = Runtime.getRuntime().exec
        (new String[] {"sqlplus", "sqlplus login/[email protected]/testGO", "@c:/DBUpd.sql"});
      BufferedReader input =
        new BufferedReader
          (new InputStreamReader(p.getInputStream()));
      while ((line = input.readLine()) != null) {
        System.out.println(line);
      }
      input.close();
    }
    catch (Exception err) {
      err.printStackTrace();
    }
  }

от так заработало smile  

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

Мы в проекте для таких целей используем http://autopatch.sourceforge.net/

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)