社区
Java SE
帖子详情
高分求解-oracle 对executeBatch的支持
zzhangwa
2010-08-30 11:34:46
oracle 对executeBatch的支持
各位大虾,请问如何让Oracle在对executeBatch处理时一条SQL出错还可以执行后面的语句呢?
...全文
758
15
打赏
收藏
高分求解-oracle 对executeBatch的支持
oracle 对executeBatch的支持 各位大虾,请问如何让Oracle在对executeBatch处理时一条SQL出错还可以执行后面的语句呢?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
nianzhang747
2010-09-10
打赏
举报
回复
出错了 就重新创建个statement 重新走剩余的batch 不行吗
zzhangwa
2010-09-02
打赏
举报
回复
在顶起来
zzhangwa
2010-08-31
打赏
举报
回复
[Quote=引用 10 楼 madfatso 的回复:]
以下摘自 JDK API 文档:
int[] executeBatch() throws SQLException
将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。返回数组的 int 元素的排序对应于批中的命令,批中的命令根据被添加到批中的顺序排序。方法 executeBatch 返回的数组中的元素可能为以下元素之一:
大于等于 0 的数 - 指示成功处理了命令……
[/Quote]
楼上的,网上大部分都是这个说法;但是
驱动程序的行为必须与特定的 DBMS 一致,要么始终继续处理命令,要么永远不继续处理命令。
这句话,特定的DBMS,在Oracle中是否可以进行更改呢。
madFatso
2010-08-31
打赏
举报
回复
以下摘自 JDK API 文档:
int[] executeBatch() throws SQLException
将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。返回数组的 int 元素的排序对应于批中的命令,批中的命令根据被添加到批中的顺序排序。方法 executeBatch 返回的数组中的元素可能为以下元素之一:
大于等于 0 的数 - 指示成功处理了命令,是给出执行命令所影响数据库中行数的更新计数
SUCCESS_NO_INFO 的值 - 指示成功执行了命令,但受影响的行数是未知的
如果批量更新中的命令之一无法正确执行,则此方法抛出 BatchUpdateException,并且 JDBC 驱动程序可能继续处理批处理中的剩余命令,也可能不执行。无论如何,
驱动程序的行为必须与特定的 DBMS 一致,要么始终继续处理命令,要么永远不继续处理命令
。如果驱动程序在某一次失败后继续进行处理,则 BatchUpdateException.getUpdateCounts 方法返回的数组将包含的元素与批中存在的命令一样多,并且其中至少有一个元素将为:
EXECUTE_FAILED 的值 - 指示未能成功执行命令,仅当命令失败后驱动程序继续处理命令时出现
在 Java 2 SDK, Standard Edition, 1.3 版中已经修改了可能的实现和返回值,以适应抛出 BatchUpdateException 对象后在批量更新中继续处理命令的选项。
返回:包含批中每个命令的一个元素的更新计数所组成的数组。数组的元素根据将命令添加到批中的顺序排序。
抛出:SQLException - 如果发生数据库访问错误,在已关闭的 Statement 上调用此方法,或者驱动程序不支持批量语句。如果未能正确执行发送到数据库的命令之一或者尝试返回结果集合,则抛出 BatchUpdateException(SQLException 的子类)。
zzhangwa
2010-08-31
打赏
举报
回复
针对于JDBC的executeBatch,MySQL在处理的过程中就直接每条SQL执行,出错后仍然继续执行后面的语句同时每条语句都会有其处理的结果,包括正确的和错误的,而Oracle只要一条出错了就不执行了并且每条的返回值都是-3,当然个人觉得Oracle可能会有相关参数的配置,所以在Oracle的社区也开了个帖子,只不过还没有找到正确的答案。楼上的,公司上不了网,我的邮箱zzhangwa@163.com。详聊。
crazylaa
2010-08-30
打赏
举报
回复
[Quote=引用 5 楼 zzhangwa 的回复:]
感谢大家的热情回复,只是有些疑问,这样的操作在MySql中是没有问题可以实现的,但是在Oracle中不知道为什么不支持呢,基于什么样的考虑不支持呢?
[/Quote]
mysql怎么实现的?学mysql不久,对这方面不了解,望指教。
crazylaa
2010-08-30
打赏
举报
回复
[Quote=引用 6 楼 zzhangwa 的回复:]
引用 4 楼 crazylaa 的回复:
executeBatch做不到。
但是你可以利用存储过程+动态sql来做。
你可以把数据作为二维数组传入存储过程,在存储过程中拼sql,
也可以把拼好的sql作为字符串数组传入存储过程去执行。
无论哪种方式传参数,在存储过程内部,使用 execute immediate 语法执行动态sql,然后内部做异常处理,sql出错时直接忽略即可。
……
[/Quote]
动态表名可以,动态的数据库名不知道是什么意思,如果你指的是用户模式,没有问题;如果是不同的数据库实例,也没有问题,但是不同的数据库实例之间,需要先建立dblink。
总而言之,只要你的两个不同的数据库之间是网络连通可互访有权限,则没有问题。
zzhangwa
2010-08-30
打赏
举报
回复
[Quote=引用 4 楼 crazylaa 的回复:]
executeBatch做不到。
但是你可以利用存储过程+动态sql来做。
你可以把数据作为二维数组传入存储过程,在存储过程中拼sql,
也可以把拼好的sql作为字符串数组传入存储过程去执行。
无论哪种方式传参数,在存储过程内部,使用 execute immediate 语法执行动态sql,然后内部做异常处理,sql出错时直接忽略即可。
[/Quote]
问一下,如果是动态的数据库动态的表名也可以实现么?
zzhangwa
2010-08-30
打赏
举报
回复
感谢大家的热情回复,只是有些疑问,这样的操作在MySql中是没有问题可以实现的,但是在Oracle中不知道为什么不支持呢,基于什么样的考虑不支持呢?
crazylaa
2010-08-30
打赏
举报
回复
executeBatch做不到。
但是你可以利用存储过程+动态sql来做。
你可以把数据作为二维数组传入存储过程,在存储过程中拼sql,
也可以把拼好的sql作为字符串数组传入存储过程去执行。
无论哪种方式传参数,在存储过程内部,使用 execute immediate 语法执行动态sql,然后内部做异常处理,sql出错时直接忽略即可。
thegodofwar
2010-08-30
打赏
举报
回复
[Quote=引用 2 楼 dengyanhua1987 的回复:]
你可以得到statement里面的ExECUTE_FAILED,
eg:
if(Statement.ExECUTE_FAILED==?)
{
//具体操作,里面的值是什么你可以去试一下
}
[/Quote]
Statement.EXECUTE_FAILED
它是int类型的其Constant Field Values为-3;这种不行吧( ⊙ o ⊙ ),觉得应该没有现成的解决办法,你可以根据需要利用SQLException再重先定义一个自己的异常处理类
小象可乐
2010-08-30
打赏
举报
回复
你可以得到statement里面的ExECUTE_FAILED,
eg:
if(Statement.ExECUTE_FAILED==?)
{
//具体操作,里面的值是什么你可以去试一下
}
guyuxuelang
2010-08-30
打赏
举报
回复
不是很熟悉,帮你顶一下
mysql-connector-java-5.1.30工具
MySQL官方提供的驱动包 mysql-connector-java-5.1.30.zip
msbase.jar,mssqlserver.jar,msutil.jar
JDBC Driver for SQL Server:msbase.jar,mssqlserver.jar,msutil.jar
oracle
对
execute
Batch
并不完全
支持
总是返回-2
使用jdbc的
execute
Batch
方法,如果数据库为
oracle
,则无论是否成功更新到数据,返回值都是-2,而不是真正被sql更新到的记录数,也就是说所谓返回的计数,实际上是被成功执行的sql命令的个数,而不是实际上被更新到的数据记录的个数,因为区分是否成功执行,只是看这条sql在
oracle
中是否抛出ora-xxxxx的异常。因为对于不同的sql,jdbc无法判断到底更新多少条数据才算正常
oracle
对
execute
Batch
并不完全
支持
总是返回-2
oracle
对
execute
Batch
并不完全
支持
总是返回-2 prepareStatement always return -2 , but statement can return the number of update 使用jdbc的
execute
Batch
方法,如果数据库为
oracle
,则无论是否成功更新到数据,返回值都是-2,而不是真正被sql更新到的记录数,也就
JDBC中的
execute
Batch
方法返回值-2
execute
Batch
方法是提交批处理的命令,返回一个整形数组int[],数组中的每个数字对应一条命令的影响行数,在
Oracle
的驱动中没有实现该功能,即提交成功后不能返回影响行数,所以返回-2。 在JDBC的规范中Statement.SUCCESS_NO_INFO(-2)代表:执行成功,受影响行数不确定
Java SE
62,634
社区成员
307,269
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章