2017-01-23 2 views
0

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

Я использую базу данных Oracle.

У меня есть следующий запрос:

UPDATE EFFET_COMMERCE 
SET EFFET_COMMERCE.CI21_ENCOF7 = (SELECT SUM(EFFET_COMMERCE_23_TMP.CI23_CUMTCR) FROM 
EFFET_COMMERCE_23_TMP WHERE EFFET_COMMERCE.CI2X_IDCONT = EFFET_COMMERCE_23_TMP.CI2X_IDCONT) 
WHERE EFFET_COMMERCE.CI21_CDPRRT = '036993' 
AND EXISTS (SELECT SUM(EFFET_COMMERCE_23_TMP.CI23_CUMTCR) FROM 
EFFET_COMMERCE_23_TMP WHERE EFFET_COMMERCE.CI2X_IDCONT = EFFET_COMMERCE_23_TMP.CI2X_IDCONT) 

Так что мне нужно обновить CI21_ENCOF7 столбец из EFFET_COMMERCE таблицы, где CI21_CDPRRT является '036993' с суммой CI23_CUMTCR значений EFFET_COMMERCE_23_TMP, которые имеют один и тот же CI2X_IDCONT.

В SQLDeveloper этот запрос работает нормально. Но когда я использую его в Spring Batch, я получаю сообщение об ошибке:

преисподней Возникла ошибка при выполнении шага injectionDesDonnees в работу effetCommercialeBeanJob org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; плохой SQL грамматика [

вставки в EFFET_COMMERCE (CI10_DATRAI, CI2X_IDCGIC, CI2X_IDCONT, CI20_CDDV, CI21_CDPRRT, CI21_CDEPR3, CI21_DACRR7, CI21_DAFEPN, CI21_DADAU8, CI21_DAFNAU, CI21_MTAUTN, CI21_DADTAP, CI21_DAFIAB, CI21_MTAUTP, CI21_ENCOF7, CI21_DAECPN, CI21_STCOLE) значения (? , & Alpha;, & alpha;, & alpha;, & alpha;, & alpha;, & alpha;, & alpha;, & EFFET_COMMERCE_23_TMP ГДЕ EFFET_COMMERCE.CI2X_IDCONT = EFFET_COMMERCE_23_TMP.CI2X_IDCONT) где EFFET_COMMERCE.CI21_CDPRRT = '036993' И EXISTS (SELECT SUM (EFFET_COMMERCE_23_TMP.CI23_CUMTCR) ОТ EFFET_COMMERCE_23_TMP ГДЕ EFFET_COMMERCE.CI2X_IDCONT = EFFET_COMMERCE_23_TMP.CI2X_IDCONT) ]; вложенное исключение java.sql.BatchUpdateException: ORA-00933: ля Commande SQL пе се Termine па correctement

(Sql команда оленья кожа»конец правильно)

Любая идея, что может быть не так?

EDIT: Вот боб от работы-report.xml:

<bean id="insertItemWriter" 
    class="org.springframework.batch.item.database.JdbcBatchItemWriter"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="sql"> 
     <value> 
     <![CDATA[ 
      insert into EFFET_COMMERCE(CI10_DATRAI,CI2X_IDCGIC,CI2X_IDCONT,CI20_CDDV,CI21_CDPRRT,CI21_CDEPR3,CI21_DACRR7,CI21_DAFEPN,CI21_DADAU8,CI21_DAFNAU,CI21_MTAUTN,CI21_DADTAP,CI21_DAFIAB,CI21_MTAUTP,CI21_ENCOF7,CI21_DAECPN,CI21_STCOLE) values (:CI10_DATRAI, :CI2X_IDCGIC, :CI2X_IDCONT, :CI20_CDDV, :CI21_CDPRRT, :CI21_CDEPR3, :CI21_DACRR7, :CI21_DAFEPN, :CI21_DADAU8, :CI21_DAFNAU, :CI21_MTAUTN, :CI21_DADTAP, :CI21_DAFIAB, :CI21_MTAUTP, :CI21_ENCOF7, :CI21_DAECPN, :CI21_STCOLE); 
      UPDATE EFFET_COMMERCE SET EFFET_COMMERCE.CI21_ENCOF7 = (SELECT SUM(EFFET_COMMERCE_23_TMP.CI23_CUMTCR) FROM EFFET_COMMERCE_23_TMP WHERE EFFET_COMMERCE.CI2X_IDCONT = EFFET_COMMERCE_23_TMP.CI2X_IDCONT) WHERE EFFET_COMMERCE.CI21_CDPRRT = '036993' AND EXISTS (SELECT SUM(EFFET_COMMERCE_23_TMP.CI23_CUMTCR) FROM EFFET_COMMERCE_23_TMP WHERE EFFET_COMMERCE.CI2X_IDCONT = EFFET_COMMERCE_23_TMP.CI2X_IDCONT); 
     ]]> 
     </value> 
    </property> 
    <!-- It will take care matching between object property and sql name parameter --> 
    <property name="itemSqlParameterSourceProvider"> 
     <bean 
      class="org.springframework.batch.item.database.BeanPropertyItemSqlParameterSourceProvider" /> 
    </property> 
</bean> 

compositeWriter боб из задания-report.xml:

<bean id="compositeWriter" class="com.socgen.cie.config.CompositeWriter" scope="step"> 
    <property name="datRaiP" value="#{jobParameters['datRaiP']}" /> 
    <property name="delegate1" ref="insert_20_ItemWriter" /> 
    <property name="delegate2" ref="insert_21_ItemWriter" /> 
    <property name="delegate3" ref="insert_23_ItemWriter" /> 
</bean> 

И в compositeWriter java класс:

public class CompositeWriter implements ItemWriter<EffetCommercialeBean> { 

    ItemWriter<EffetCommercialeBean> itemWriter1; 
    ItemWriter<EffetCommercialeBean> itemWriter2; 
    ItemWriter<EffetCommercialeBean> itemWriter3; 
    private Date datRaiP; 


    public void write(List<? extends EffetCommercialeBean> items) throws Exception { 
     List<EffetCommercialeBean> inserts_20 = new ArrayList<EffetCommercialeBean>(); 
     List<EffetCommercialeBean> inserts_21 = new ArrayList<EffetCommercialeBean>(); 
     List<EffetCommercialeBean> inserts_23 = new ArrayList<EffetCommercialeBean>(); 
     Date date = getDatRaiP(); 
     for(EffetCommercialeBean re : items) { 
//   if(re.getCI10_DATRAI()!=null){ 
//    date = dateFinDuMois(re.getCI10_DATRAI()); 
//   } 
      re.setCI10_DATRAI(date); 
      if("20".equals(re.getPattern())) { 
       inserts_20.add(re); 
      } 
      if("21".equals(re.getPattern())) { 
       inserts_21.add(re); 
      } 
      if("23".equals(re.getPattern())) { 
       inserts_23.add(re); 
      } 
     } 
     itemWriter1.write(inserts_20); 
     itemWriter2.write(inserts_21); 
     itemWriter3.write(inserts_23); 
    } 

    public void setDelegate1(ItemWriter<EffetCommercialeBean> itemWriter){ 
     this.itemWriter1 = itemWriter; 
    } 

    public void setDelegate2(ItemWriter<EffetCommercialeBean> itemWriter) { 
     this.itemWriter2 = itemWriter; 
    } 

    public void setDelegate3(ItemWriter<EffetCommercialeBean> itemWriter) { 
     this.itemWriter3 = itemWriter; 
    } 

    public Date getDatRaiP() { 
     return datRaiP; 
    } 

    public void setDatRaiP(Date datRaiP) { 
     this.datRaiP = datRaiP; 
    } 

} 
+2

Вы использовали неверный метод Spring для выполнения обновления. Отправьте свой Java-код. Интерпретатор преобразует ваш оператор SQL как INSERT INTO –

+0

Просто отредактировал сообщение, теперь я предполагаю, что мне нужно создать конкретный компонент в файле job-report.xml для обновления?Думаю, мне также понадобится класс java-класса compositeUpdater? – Ellone

ответ

0

В конце концов, так как я хотел казнить UPDATE, наконец, я в конечном итоге делает это после выполнения задания, так как я ничего о весенней партии не знаю, это было простое решение для меня:

execution = jobLauncher.run(job, new JobParameters(jobParametersMap)); 

       DataSource datasource = (DataSource) context.getBean("dataSource"); 
       Connection conn = datasource.getConnection(); 
       PreparedStatement query = conn.prepareStatement("UPDATE EFFET_COMMERCE SET EFFET_COMMERCE.CI21_ENCOF7 = (SELECT SUM(EFFET_COMMERCE_23_TMP.CI23_CUMTCR) FROM EFFET_COMMERCE_23_TMP WHERE EFFET_COMMERCE.CI2X_IDCONT = EFFET_COMMERCE_23_TMP.CI2X_IDCONT) WHERE EFFET_COMMERCE.CI21_CDPRRT = '036993' AND EXISTS (SELECT SUM(EFFET_COMMERCE_23_TMP.CI23_CUMTCR) FROM EFFET_COMMERCE_23_TMP WHERE EFFET_COMMERCE.CI2X_IDCONT = EFFET_COMMERCE_23_TMP.CI2X_IDCONT)"); 
       query.executeQuery(); 
Смежные вопросы