Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.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中的ExecuteBatch方法返回值为-2的数组_Java_Oracle_Jdbc - Fatal编程技术网

java中的ExecuteBatch方法返回值为-2的数组

java中的ExecuteBatch方法返回值为-2的数组,java,oracle,jdbc,Java,Oracle,Jdbc,当我在java中执行executeBatch方法时,它返回一个int数组,该数组很好,但值是所有数组元素的-2 显示受影响行数的数字应为0或+ve, 但是它返回-2 当我在数据库中检查它时,所有更新都成功完成。 请解释-2的含义以及我如何发现受影响的行数 谢谢,, Deepesh Uniyaljdbc规范对批量更新的返回代码有以下说明: ■ 0或更大-命令已成功处理,且值为 更新计数,指示数据库中受影响的行数 命令的执行 第14章批量更新121 ■ Statement.SUCCESS\u NO\

当我在java中执行executeBatch方法时,它返回一个int数组,该数组很好,但值是所有数组元素的-2

显示受影响行数的数字应为0或+ve, 但是它返回-2

当我在数据库中检查它时,所有更新都成功完成。 请解释-2的含义以及我如何发现受影响的行数

谢谢,,
Deepesh Uniyal

jdbc规范对批量更新的返回代码有以下说明:

■ 0或更大-命令已成功处理,且值为 更新计数,指示数据库中受影响的行数 命令的执行 第14章批量更新121

■ Statement.SUCCESS\u NO\u INFO-命令已成功处理, 但受影响的行数未知

Statement.SUCCESS\u NO\u INFO被定义为-2,因此您的结果表明一切正常,但您无法获得更新列数的信息

oracle文档说明:

• 对于准备好的语句批处理,不可能知道批处理中的每个语句在数据库中影响的行数。因此,所有数组元素的值都为-2。根据JDBC2.0规范,值-2表示操作成功,但受影响的行数未知

• 对于泛型语句批处理,数组包含实际更新计数,指示受每个操作影响的行数。只有在Oracle标准批处理实现中的通用语句中才能提供实际更新计数

• 对于可调用语句批处理,服务器始终返回值1作为更新计数,而与每个操作影响的行数无关

因此,如果您需要更新计数,您似乎不能使用
PreparedStatement
s,而必须返回到普通的
Statement
s

值-2表示元素已成功处理,但受影响的行数未知


请注意,由于Oracle 12c,这种情况不应该再发生了:

对于准备好的语句批处理,数组包含实际更新计数,指示受每个操作影响的行数


请参阅标准更新批处理

conn.setAutoCommit(false);

PreparedStatement pstmt = 
          conn.prepareStatement("INSERT INTO employees VALUES(?, ?)");

pstmt.setInt(1, 2000);
pstmt.setString(2, "Milo Mumford");
pstmt.addBatch();

pstmt.setInt(1, 3000);
pstmt.setString(2, "Sulu Simpson");
pstmt.addBatch();

int[] updateCounts = pstmt.executeBatch();

conn.commit();

pstmt.close();
...
您可以处理更新计数数组以确定批处理是否成功

Oracle实施标准批处理时的错误处理
如果任何一个批处理操作未能成功完成,或者在executeBatch调用期间尝试返回结果集,则处理将停止,并生成java.sql.BatchUpdateException

批次异常发生后,可以使用BatchUpdateException对象的getUpdateCounts方法检索更新计数数组。这将返回更新计数的整数数组,与executeBatch方法一样。在标准更新批处理的Oracle实现中,处理批处理后,更新计数数组的内容如下所示:

  • 对于准备好的语句批处理,如果其间出现错误 执行批处理时,executeBatch方法无法返回 值,而是抛出一个BatchUpdateException。在这种情况下 异常本身携带一个大小为n的整数数组作为其数据,其中n 是成功执行记录的次数。例如,如果 批次大小为5,错误发生在第4条记录上,然后 BatchUpdateException有一个大小为3的数组(执行了3条记录) 数组中的每个项表示有多少行 每个人都受到影响

  • 对于泛型语句批处理或可调用语句批处理,更新 计数数组只是包含实际更新的部分数组
    计数到错误点。实际更新计数可以是 提供此选项是因为Oracle JDBC无法对泛型和 Oracle标准更新实现中的可调用语句
    配料

例如,如果批处理中有20个操作,前13个操作成功,第14个操作生成异常,则更新计数数组将有13个元素,其中包含成功操作的实际更新计数

在这种情况下,您可以根据自己的喜好提交或回滚成功的操作


在代码中,当批处理失败时,当发生异常时,应该准备处理数组元素中的-3或true更新计数。对于失败的批处理,您将拥有一个完整的-3数组或一个部分正整数数组。

编写您尝试过的代码…谢谢piet.t,但如何获得批处理中受影响的行数,根据我的流程,我们必须知道它,我们正在更新数据库中的600多个tps,因此我无法避免批处理,请建议。添加一些oracle信息。我不知道这是否有帮助,但您可以尝试。是否有任何方法可以获取受影响行的数量??请提出建议。