oracle 对executeBatch的支持
各位大虾,请问如何让Oracle在对executeBatch处理时一条SQL出错还可以执行后面的语句呢?

解决方案 »

  1.   

    你可以得到statement里面的ExECUTE_FAILED,
    eg:
    if(Statement.ExECUTE_FAILED==?)
    {
       //具体操作,里面的值是什么你可以去试一下
    }
      

  2.   

    Statement.EXECUTE_FAILED它是int类型的其Constant Field Values为-3;这种不行吧( ⊙ o ⊙ ),觉得应该没有现成的解决办法,你可以根据需要利用SQLException再重先定义一个自己的异常处理类
      

  3.   

    executeBatch做不到。
    但是你可以利用存储过程+动态sql来做。
    你可以把数据作为二维数组传入存储过程,在存储过程中拼sql,
    也可以把拼好的sql作为字符串数组传入存储过程去执行。无论哪种方式传参数,在存储过程内部,使用 execute immediate 语法执行动态sql,然后内部做异常处理,sql出错时直接忽略即可。
      

  4.   

    感谢大家的热情回复,只是有些疑问,这样的操作在MySql中是没有问题可以实现的,但是在Oracle中不知道为什么不支持呢,基于什么样的考虑不支持呢?
      

  5.   

    动态表名可以,动态的数据库名不知道是什么意思,如果你指的是用户模式,没有问题;如果是不同的数据库实例,也没有问题,但是不同的数据库实例之间,需要先建立dblink。
    总而言之,只要你的两个不同的数据库之间是网络连通可互访有权限,则没有问题。
      

  6.   

    mysql怎么实现的?学mysql不久,对这方面不了解,望指教。
      

  7.   

    针对于JDBC的executeBatch,MySQL在处理的过程中就直接每条SQL执行,出错后仍然继续执行后面的语句同时每条语句都会有其处理的结果,包括正确的和错误的,而Oracle只要一条出错了就不执行了并且每条的返回值都是-3,当然个人觉得Oracle可能会有相关参数的配置,所以在Oracle的社区也开了个帖子,只不过还没有找到正确的答案。楼上的,公司上不了网,。详聊。
      

  8.   

    以下摘自 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 的子类)。
      

  9.   

    楼上的,网上大部分都是这个说法;但是驱动程序的行为必须与特定的 DBMS 一致,要么始终继续处理命令,要么永远不继续处理命令。这句话,特定的DBMS,在Oracle中是否可以进行更改呢。
      

  10.   

    出错了 就重新创建个statement 重新走剩余的batch 不行吗