— Cause: java.sql.SQLSyntaxErrorException: ORA-01745: 无效的主机/绑定变量
使用ibatis的iterate报错 Cause: java.sql.SQLSyntaxErrorException: ORA-01745: 无效的主机/绑定变量
原因是list的size太大,尝试过2000,1000都不行,后改为500就可以了
public void autoSynIncomeReport() {
int c = 500;
Map<String, Object> inMap = new HashMap<>();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM");
Date date = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.MONTH, -1);
String lastMonth = sdf.format(cal.getTime());
inMap.put("lastMonth",lastMonth);
long count = busuAccountDao.qryIncomeReportFromDbsCount(inMap);
for(int i=0; i<(count/c+1); i++){
inMap.put("BEGIN_NUM", i*c+1);
inMap.put("END_NUM", (i+1)*c);
//查询出待更新的数据
List<Map<String, Object>> incomeReportFromDbsList = busuAccountDao.qryIncomeReportFromDbs(inMap);
if(incomeReportFromDbsList.size() > 0){
busuAccountDao.batchInsertIncomeReport(incomeReportFromDbsList);
}
return;
}
}
<insert id="batchInsertIncomeReport" parameterClass="java.util.List">
INSERT ALL
<iterate conjunction=" ">
INTO RENT_INCOME_REPORT_DBS (
BOUND_TYPE,
DATE_TYPE,
DATE_SRC,
ORIGINATOR_NAME,
PROFESSIONAL_LINE,
FEE_PERIOD,
PRODUCT_CODE,
PRODUCT_NAME
) VALUES
<![CDATA[
(
#listMap[].BOUNDTYPE#,
#listMap[].DATETYPE#,
#listMap[].DATESRC#,
#listMap[].ORIGINATORNAME#,
#listMap[].PROFESSIONALLINE#,
#listMap[].FEEPERIOD#,
#listMap[].PRODUCTCODE#,
#listMap[].PRODUCTNAME#
)
]]>
</iterate>
<![CDATA[
SELECT 1 FROM dual
]]>
</insert>