Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 适用于更新的DB2 JDBC查询不适用于batchUpdate_Java_Spring_Jdbc_Db2_Zos - Fatal编程技术网

Java 适用于更新的DB2 JDBC查询不适用于batchUpdate

Java 适用于更新的DB2 JDBC查询不适用于batchUpdate,java,spring,jdbc,db2,zos,Java,Spring,Jdbc,Db2,Zos,我试图在一个程序中实现批处理更新,我想我可能在DB2JDBC驱动程序中遇到了一个bug或其他问题。我的问题是: 插入CONTENTSOURCE(CONTENTSOURCE\u ID,CS\u NAME)值(?,加密(转换为VARCHAR(280)用于位数据)) 下面是我对springJdbcTemplate的调用,用于单个插入,它可以工作 query = QUERY_INSERT_ENCRYPT; insert.update( query,

我试图在一个程序中实现批处理更新,我想我可能在DB2JDBC驱动程序中遇到了一个bug或其他问题。我的问题是:

插入CONTENTSOURCE(CONTENTSOURCE\u ID,CS\u NAME)值(?,加密(转换为VARCHAR(280)用于位数据))

下面是我对spring
JdbcTemplate
的调用,用于单个插入,它可以工作

query = QUERY_INSERT_ENCRYPT;
insert.update(
                query,
                new Object[] {
                        contentSourceId,
                        contentSourceObject.getContentSourceName()
                                .getBytes() });
但是,当我批量尝试相同的操作时,我会得到一个似乎不适用于我的查询的错误

insertArgs.add(new Object[] { contentSource.getContentSourceId(),
                contentSource.getContentSourceName().getBytes() });
returnArray = batchInsert.batchUpdate(QUERY_INSERT_ENCRYPT, insertArgs);
当运行batchUpdate时,每一行都会得到一个SQLCODE-312,但我不会对变量做任何事情。下面是从异常中刮取的一些错误的输出

Server error message: A NON-ATOMIC INSERT STATEMENT ATTEMPTED TO PROCESS MULTIPLE ROWS OF DATA, BUT ERRORS OCCURRED

--------------- SQLCA ---------------

Error code: -254

SQLERRMC: INSERT

  token 0: INSERT

SQLERRP: DSNXRINS

SQLERRD(1): -400

SQLERRD(2): 0

SQLERRD(3): 0

SQLERRD(4): -1

SQLERRD(5): 0

SQLERRD(6): 0

SQLSTATE: 22530

Server error message: VARIABLE <unknown> IS NOT DEFINED OR NOT USABLE

--------------- SQLCA ---------------

Error code: -312

SQLERRMC: <unknown>

  token 0: <unknown>

SQLERRP: DSNXRIHS

SQLERRD(1): -996

SQLERRD(2): 0

SQLERRD(3): 0

SQLERRD(4): -1

SQLERRD(5): 0

SQLERRD(6): 0

SQLSTATE: 42618
服务器错误消息:非原子INSERT语句试图处理多行数据,但出现错误
---------------SQLCA---------------
错误代码:-254
SQLERRMC:插入
令牌0:插入
SQLERRP:DSNXRINS
SQLERRD(1):-400
SQLERRD(2):0
SQLERRD(3):0
SQLERRD(4):-1
SQLERRD(5):0
SQLERRD(6):0
SQLSTATE:22530
服务器错误消息:变量未定义或不可用
---------------SQLCA---------------
错误代码:-312
SQLERRMC:
令牌0:
SQLERRP:DSNXRIHS
SQLERRD(1):-996
SQLERRD(2):0
SQLERRD(3):0
SQLERRD(4):-1
SQLERRD(5):0
SQLERRD(6):0
SQLSTATE:42618
我在很久以前发现了一个不同级别/版本的驱动程序的错误修复,所以我很困惑这是否是同一个问题。 相关摘录:

所有连接:一个SQLCODE312(-312)与 “SqlSyntaxErrorException:未定义变量 运行PureQuery客户端时报告“或不可用” 与DB2z/OS的静态执行模式连接上的优化器 版本8或以上。这个问题与环境有关 驱动程序使用的多行插入(MRI)支持 连接到DB2 z/OS时实现executeBatch() 版本8或以上。在本例中,语句是绑定的 动态执行模式无MRI,但 使用MRI格式错误地执行静态 执行模式。(115716)


那么,我是做错了什么,还是驱动程序可能出了问题,我应该向IBM提出一个问题?

看起来您的一个变量超过280个字符,或者可能无法使用getBytes方法(使用默认字符集)对其进行解释。这可以解释“变量未定义或不可用”错误。每行得到-312的事实可能表明实际上没有提交任何内容(所有内容都已回滚)。这可能与驱动程序/数据库有关(请看一看),此时,我只使用测试数据,所有这些数据都是愉快的路径值,因为批处理更新尚未工作。如果我没有弄错的话,-312是关于SQL中定义的变量,我使用的SQL是完全不相关的。这也不能解释为什么使用完全相同的SQL的完全相同的数据可以逐行插入,但在批处理中失败。我只能说:尝试小批量(仅插入2次)并逐渐增加插入的数量。我在测试中一次尝试了1、2和3行,每一行都有相同的sqlcode-312,并且在使用JdbcTemplate batchUpdate方法之前,每一行的数据都已通过使用JdbcTemplate更新方法成功验证。除了驱动程序本身有一个bug之外,我看不到其他选择。你试过最新的驱动程序了吗?