标题上来先展示异常信息## 标题
java.sql.BatchUpdateException: 批次处理 0 Insert INTO bj_lianjia (id,url,timeinfo,region,totalprice,housetype,housearea,unitprice,direction,decoration,elevator,houseinfo,attention,visited,utime) VALUES (‘2587’,‘小张’,‘2018-05-06 +08:00:00’,‘富力城B区’,‘1880.0’,‘2室1厅’,‘187.00999450683594’,‘100530.0’,NULL,‘精装’,‘1’,‘4室2厅,187.01平米,南北,精装,有电梯’,‘19’,‘29’,‘2020-08-01 05:38:02.000000 +08:00:00’) 被中止,呼叫 getNextException 以取得原因。
at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2743)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1928)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:405)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2892)
at com.casic304.dataexplorer.connection.core.jdbc.rdbmswriter.RdbmsWriter.doBatchInsert(RdbmsWriter.java:162)
at com.casic304.dataexplorer.connection.core.jdbc.rdbmswriter.RdbmsWriter.startWrite(RdbmsWriter.java:100)
at com.casic304.dataexplorer.connection.postgresql.PostgresqlWriter.startWrite(PostgresqlWriter.java:50)
at com.casic304.dataexchanger.core.task.runer.WriterRunner.run(WriterRunner.java:43)
at java.lang.Thread.run(Thread.java:748)
最近做国产化适配,小组开发了一款数据交换工具,当设计到postgresql的时候,从postgresql中读取没事,但是从别的数据库做批量插入操作的时候,会报上边的异常信息。
后发现,postgresql的批量插入与(oracle ,mysql,达梦,sqlserver)不太一样 ,
eg:在其他四种(oracle ,mysql,达梦,sqlserver)做批量插入 的sql 只用如下书写
String sql=insert into tableName(你自己的表名称)(column1,column2,…)values(?,?,…)
占位符只需要用?占位就可以了。
但是postgresql他不 ,他的占位符要?::columnTypeName,
所以他的sql 就为 String sql=insert into tableName(你自己的表名称)(column1,column2,…)values(?::column1TypeName,?::column2TypeName,…)
所以做postgresql批处理的时候,还需要知道列类型。
需要注意的是postgresql中 serial 的插入占位符类型是?::int,bit类型插入占位符是?::bit varying,
需要多加注意。