java.sql.BatchUpdateException: 并非所有返回参数都已注册这个异常应该算是批量异常是吧!
那么,后面的中文说明的是什么呢?
请遇见过的大虾解释。。

解决方案 »

  1.   


    并非所有返回参数都已注册
    你执行的语句中含有的返回参数没有全部绑定,要求你的statement做一个类似这样的动作:
    cs.registerOutParameter(2, OracleTypes.CURSOR);
      

  2.   

    嗯、谢谢。
    继续高手询问此事:oracle10g支持返回多个主键值吗?
    JDBC 是否可以呢! 我知道是可以的呢!
    但是,性能问题比较差所以我选择了使用oracle自带的JDBC方式执行SQL语句。
    但是,不知道、是否能一次性取回多条插入的主键值呢。前提,不执行select语句。我的问题是:当我执行主表像子表插入数据的时候需要主表的主键。
    当我插入一个子表数据的时候外键等于主表中的主键值、如果,是多条数据的时候 我使用的批量处理。
    这个时候就会出现
    pre.registerReturnParameter(aValue.length + 1,OracleTypes.VARCHAR, 320);// 设置占位符参数的大小
    java.lang.ArrayIndexOutOfBoundsException: 321
    at oracle.jdbc.driver.T4CVarcharAccessor.unmarshalOneRow(T4CVarcharAccessor.java:284)
    at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:610)
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:216)
    at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:955)
    at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10580)
    at framework.zze2p.mod.pojo3.Pojo_3HOC.save_Do_OracleJX(Pojo_3HOC.java:266)
    at framework.zze2p.mod.pojo3.Pojo_3HOC.save_Do_OracleJX(Pojo_3HOC.java:282)
    at framework.zze2p.mod.pojo3.Pojo_3HOC.c$saveOracleJX(Pojo_3HOC.java:168)
    at framework.zze2p.mod.pojo3.Pojo_3HOC.c$saveOracleJX(Pojo_3HOC.java:149)
    at framework.zze2p.mod.pojo3.Pojo_3HO.c$save(Pojo_3HO.java:47)
    at framework.zze2p.mod.pojo3.testPojo_HO.c$save(testPojo_HO.java:189)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99)
    at org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81)
    at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
    at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
    at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
    at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:66)
    at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
    at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
    at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
    at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
      

  3.   

    pre.registerReturnParameter(aValue.length + 1,OracleTypes.VARCHAR, 320);// 设置占位符参数的大小
    java.lang.ArrayIndexOutOfBoundsException: 321 格里 320啥意思啊?
    看得出前面似乎是有多少个参数就注册多少个返回值。
    我没整过批量插入返回批量主键滴,,,
      

  4.   

    320代表 返回值的大小每一次插入都要返回同样大小的数据量。如果,插入到N+1次的话那么返回的大小也是N+1次数据量。如果,是普通的批量insert的情况下是没有任何问题。
    但是,如果考虑每一次插入的数据返回值 根据值插入到子表中的数据根据着个值来添加数据的情况下应该很麻烦。
    麻烦的是如果是N条记录的情况下就要返回N条记录的主键值 根据主键值存放在子表当中在统一的insert吧!
    这个时候就会出现以上麻烦的事情。
    我找了oracle JDBC官方文档看了看 有很多方法,但是不知道如何使用呢!
    如,java中的Pre与oraclePre是什么关系 是继承关系吗? 等等。
    期待你的回答。
      

  5.   

    java.sql.PreparedStatement是个接口。OraclePreparedStatement实现了这个接口。
    我还是搞不明白你为什么要那么多返回的主键值,有什么用呢?
    一般我要进行批量插入,都是用oracle存储过程来实现的,参数传入的是多维数组对象。如果需要插入之后再把id及其他信息传出来,可以返回一个游标或者一个数组。用executeBatch我一般是用来只插入不需要返回值的以提高速度。
    其实说白了,就是我目前不知道像你这种情况用executeBatch该咋整,8好意思咯。
      

  6.   

    呵呵、简单的说吧!!
    使用存储过程没问题可以解决以上问题。
    但是,对于日后的通用性有所不便懂吧!
    所以,我写了SQL语句啦。。例子如下:
    主表A 两个字段 id 主键 类型varchar2(32) 数据库自产生SYS_GUID(), name 名称varchar2(16)
    子表B 三个字段 bid主键 类型 varchar2(32)数据库自产生,name名称 varchar2(16),外键id varchar2(32)
    当主表添加一条记录的时候主键取回给子表 子表拿到主键号同时保持相对的主键值 这样做的目的是日后如果做级联增或者删的情况下使用这种方式大大的提高速度啦。
    这是插入一条数据的情况下。
    如果,插入N跳数据呢!同理也要按着这种思想去做操作。
    确实,比较绕也比较麻烦,但是总体上步骤也就以上几点吧!!
    最后,别考虑N表级联哟,这样想的话很痛苦的哦。。呵呵
    还有,只有为何把主键设置成varchar这样保持当前实力下唯一性。
    至于速度没有int快啦!! 呵呵,请谅解。
    还有什么顾虑请加我QQ:477579
    备注:在下尊称。。 麻烦啦!
    等待,关注
      

  7.   

    哦,我也是。
    第一次,遇见此情形所以有点困惑。
    不知道,该如何去做这件事情啦。
    现在,有两种实现方式但是比较笨也比较蠢。
    第一种,就是没次都要查询一次主表的ID值
    第二种,还算比较聪明啦!!使用过程完成。把返回值附加变量。
    使用CALLSTA读取 就可以啦。。 
    过程好处在于可以把多条记录的数据都存在一个集合当中 ,把集合填满以后在提交事务。这样做的的话好比一桶水满了后在浇地。。
    这就在SQL中批量处理所带来的困惑吧!! 你可以使用PRE来完成批量 但是,你可拿不会来批量数据的主键值呀。。
    在批量处理过程中必须在INSERT中设置变量存储着个主键返回值。 但是,如果批量处理的情况下返回值可能很多呀,他是以什么方式返回的呢!! 目前,没有相通的事情太啦。。
    慢慢想吧!! 谢谢,,加我QQ:477579