public String importCsvData() throws Exception {
InputStream is = new FileInputStream(doc);
CsvReader csvReader = new CsvReader(is, Charset.forName("GBK"));
List<KS> list = new ArrayList<KS>();
// 跳过表头
csvReader.readHeaders();
// 逐行读入
while (csvReader.readRecord()) {
String[] data = csvReader.getValues();
String keyword = data[0];
String synonyms = data[1];
String tradeName = data[2]; if (keyword != null && !"".equals(keyword) && synonyms != null
&& !"".equals(synonyms)) {
KS ks = new KS();
ks.setKeyword(keyword);
ks.setSynonyms(synonyms);
ks.setTrade(tradeName);
list.add(ks); }
}
for (int j = 0; j < list.size(); j++) {
KS ks = (KS) list.get(j);
if (ksService.getKSByKS(ks.getSynonyms(),
ks.getKeyword(), "1") == 0) {
if(ks.getTrade()!=null&&!"".equals(ks.getTrade())){
Trade trade = tradeService.getTradeByIdAndName(null,ks.getTrade());
if(trade!=null){
ks.setTrade(trade.getId().toString());
}
}
ksService.save(ks, "1");
}
}
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (csvReader != null) {
csvReader.close();
}
return RELOAD;
}
select keyword, synonyms, invtKeyword, id, ivtid, tradeName
  from (select a.keyword,
               wm_concat(a.synonyms) as synonyms,
               b.keyword as invtKeyword,
               min(a.id) as id,
               min(b.id) as ivtid,
               d.name as tradeName
          from t_camp_keyword_synonyms a
          left join t_invt_inventory b on a.keyword = b.keyword
          left join t_comp_keyword_trade_map c on a.keyword = c.keyword
          left join t_comp_trade d on d.id = c.trade_id
         group by a.keyword, b.keyword, d.name)当我第一次执行这个查询语句的时候可以执行并查出数据,但我在程序里执行上面导入方法的时候就开始报:
ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太小。
ORA-06512:PL/SQL:在"WMSYS.WM_CONCAT_IMPL",line 30这个错误,
后来干脆在oracle里面执行这个sql也开始报这个错了,求各位帮帮忙.

解决方案 »

  1.   

    sql在数据库里面也报错么?  查看下分区内存还剩多少? 
      

  2.   

    wm_concat(a.synonyms) 连接字符上限了……
      

  3.   

    当数据量大是,这个拼接成的字符串就太长了,
    超过所能容纳的范围就不行了啊,比如varchar2,好像也就到4000吧
    wm_concat(a.synonyms) as synonyms,