高分求解-oracle 对executeBatch的支持

zzhangwa 2010-08-30 11:34:46
oracle 对executeBatch的支持
各位大虾,请问如何让Oracle在对executeBatch处理时一条SQL出错还可以执行后面的语句呢?
...全文
758 15 打赏 收藏 转发到动态 举报
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
  • 打赏
  • 举报
回复
不是很熟悉,帮你顶一下

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧