【问题标题】:Spring Batch DB2 update DB2GSE.ST_POLYGON failsSpring Batch DB2 更新 DB2GSE.ST_POLYGON 失败
【发布时间】:2015-09-14 09:06:50
【问题描述】:

我正在尝试将多边形插入到托管在 z/OS 上的 db2 表中 这是我的数据库项目编写器

<bean id="databaseItemWriter"
    class="org.springframework.batch.item.database.JdbcBatchItemWriter">
    <property name="dataSource" ref="dataSource" />
    <property name="sql">
        <value>  
        <![CDATA[         
          INSERT INTO SAMPLE_GEOMETRIES
                    (GEO_NAME, GEOMETRY)
            VALUES
                    ( ?, DB2GSE.ST_POLYGON(?, 1))
         ]]>
        </value>
    </property>

    <property name="itemPreparedStatementSetter">
        <bean class="com.amex.elbs.DAO.GeometriesItemPreparedStatementSetter" />
    </property>
</bean>

这是我自定义的预处理语句设置器

公共类 GeometriesItemPreparedStatementSetter 实现 ItemPreparedStatementSetter{

@Override
public void setValues(Geometries item, PreparedStatement ps) throws SQLException {
    ps.setString(1, item.Id);
    ps.setString(2, item.Polygon);
}

}

这是我的示例输入文件。它是用管道分隔的,并且有 ID 和多边形坐标。

pm251|'POLYGON((-159.335174733889 21.9483433404175,-159.327130348878 22.0446395507162,-159.295025589769 22.1248124949548,-159.343195828355 22.1970166285359,-159.391366885913 22.2291198667724,-159.576012589057 22.2131796383001,-159.712505933171 22.1490592515515,-159.800814224332 22.0366665967853,-159.736592652746 21.9644203111023,-159.640246973766 21.9483657695954,-159.576021285803 21.8841361312636,-159.439545188912 21.8680716835921,-159.335174733889 21.9483433404175))', 1

以下语句在z/OS上执行成功。

 ,INSERT,INTO SAMPLE_GEOMETRIES
  (GEO_NAME, GEOMETRY)
  VALUES
  ( 'PM',
  DB2GSE.ST_POLYGON('POLYGON((
       -159.335174733889 21.9483433404175,
       -159.327130348878 22.0446395507162,
       -159.295025589769 22.1248124949548,
       -159.343195828355 22.1970166285359,
       -159.391366885913 22.2291198667724,
       -159.576012589057 22.2131796383001,
       -159.712505933171 22.1490592515515,
       -159.800814224332 22.0366665967853,
       -159.736592652746 21.9644203111023,
       -159.640246973766 21.9483657695954,
       -159.576021285803 21.8841361312636,
       -159.439545188912 21.8680716835921,
       -159.335174733889 21.9483433404175))',1))
---------+---------+---------+---------+---------
DSNE615I NUMBER OF ROWS AFFECTED IS 1

这是我执行时得到的

Caused by: com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-245, SQLSTATE=428F5, SQLERRMC=DB2GSE.ST_POLYGON, DRIVER=4.12.55
    at com.ibm.db2.jcc.am.hd.a(hd.java:676)
    at com.ibm.db2.jcc.am.hd.a(hd.java:60)
    at com.ibm.db2.jcc.am.hd.a(hd.java:127)
    at com.ibm.db2.jcc.am.mn.c(mn.java:2621)
    at com.ibm.db2.jcc.am.mn.d(mn.java:2609)
    at com.ibm.db2.jcc.am.mn.a(mn.java:2085)
    at com.ibm.db2.jcc.am.nn.a(nn.java:7054)
    at com.ibm.db2.jcc.am.mn.a(mn.java:2062)
    at com.ibm.db2.jcc.t4.cb.g(cb.java:136)
    at com.ibm.db2.jcc.t4.cb.a(cb.java:41)
    at com.ibm.db2.jcc.t4.q.a(q.java:32)
    at com.ibm.db2.jcc.t4.rb.i(rb.java:135)
    at com.ibm.db2.jcc.am.mn.ib(mn.java:2055)
    at com.ibm.db2.jcc.am.nn.rc(nn.java:3219)
    at com.ibm.db2.jcc.am.nn.s(nn.java:3370)
    at com.ibm.db2.jcc.am.nn.l(nn.java:2499)
    at com.ibm.db2.jcc.am.nn.addBatch(nn.java:2438)
    at org.springframework.batch.item.database.JdbcBatchItemWriter$1.doInPreparedStatement(JdbcBatchItemWriter.java:190)
    at org.springframework.batch.item.database.JdbcBatchItemWriter$1.doInPreparedStatement(JdbcBatchItemWriter.java:185)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:644)
    ... 28 more

【问题讨论】:

  • 您是说您成功地使用 SPUFI(或其他东西,如果是这样呢?)来测试 SQL?然后它试图从程序中执行它失败了?你检查了消息/代码www-304.ibm.com/support/knowledgecenter/SSEPEK_10.0.0/…,你能做些什么吗?
  • 我会尝试删除 '' 引号; ps.setString() 应该自动完成

标签: spring db2 spring-batch spatial


【解决方案1】:

error message for SQLCODE -245 内容为:“函数调用例程名称不明确”。

显然,数据库中有不止一个版本的DB2GSE.ST_POLYGON,接受不同类型的参数。您正在使用无类型参数标记:DB2GSE.ST_POLYGON(?, 1),因此 DB2 无法确定您想要哪个版本的 DB2GSE.ST_POLYGON

使用适当的数据类型向函数调用添加显式强制转换,例如:

DB2GSE.ST_POLYGON(CAST( ? AS VARCHAR(1000)), 1)

【讨论】:

  • 现在我得到一个不同的错误。 Spring Batch 出错 - 由以下原因引起:com.ibm.db2.jcc.am.BatchUpdateException:[jcc][t4][102][10040][4.12.55] 批处理失败 ERRORCODE=-4229,SQLSTATE=null。我在 DB2 日志上看到 1 个错误,但我不确定它是否与此有关 - DB2 日志中的错误 - “SQLCODE = -254,错误:尝试处理多行数据的非原子插入语句,但出现错误发生”。
  • 我写了另一个存储过程来做同样的更新,我也得到了这个 SQLCODE = -245。现在当我添加 CAST 时,SP 工作了。所以我认为这个新错误来自 Spring Batch
猜你喜欢
  • 1970-01-01
  • 2020-08-12
  • 1970-01-01
  • 2022-11-12
  • 2020-06-08
  • 1970-01-01
  • 1970-01-01
  • 2023-02-07
  • 2023-03-15
相关资源
最近更新 更多