存储过程如下:
  PROCEDURE Query_org_increment(Errbuf       OUT NOCOPY VARCHAR2,
                                     Retcode      OUT NOCOPY NUMBER,
                                     p_Record_Set OUT Record_Set,
                                     p_start_date VARCHAR2,
                                     p_end_date   VARCHAR2)
用PreparedStatement调用此存储过程时按顺序赋参数值时会出错:参数个数或类型不匹配
PreparedStatement stmt = new PreparedStatement();
for (int i=0;i<params.length;i++)
stmt.setObject(i + 1, params[i]);
但当我把存储过程入口参数放在前面时,就不会报错了
  PROCEDURE Query_org_increment(
                                     p_start_date VARCHAR2,
                                     p_end_date   VARCHAR2
                                     Errbuf       OUT NOCOPY VARCHAR2,
                                     Retcode      OUT NOCOPY NUMBER,
                                     p_Record_Set OUT Record_Set,
)
我估计PreparedStatement给参数赋值的方法是把所有存储过程的参数都当作是入口参数,不会区分是否是IN还是OUT类型。如果存储过程的入口参数的顺序是错乱的,我怎么去赋值呢

解决方案 »

  1.   

    PreparedStatement stmt = new PreparedStatement(); 
      

  2.   

    不是这个问题,PreparedStatement stmt = new PreparedStatement();是我提问时乱写的
      

  3.   

    调用存储过程不是用这个接口的对象,是用CallableStatement对象来调用存储过程的 PreparedStatement 对象是动态绑定参数查询语句。
    对于Out类型参数的使用 CallableStatement有getXxx方法来获取Out参数返回值。
      

  4.   

    我只能根据parameterMetaData来判断哪些是IN,哪些是OUT了,然后再赋值
      

  5.   

    你在调用存储过程的时候就应该已经知道存储过程的名称和其参数的各个属性了,如果你想做一个功能强大点的接口调用,那么你用parameterMetaData来进行判断也是可以的。
    因为存储过程参数的属性在java里面设置是没有任何意义的,因为参数属性是数据库里面的属性,不属于java,所以java只能获取属性不能设置。
    不过一般来说存储过程的参数都是in类型属性的,需要返回值的时候一般都用函数。
      

  6.   

    你这样试过没,我用oracle驱动,出错:
    ParameterMetaData parameter = stmt.getParameterMetaData();
    Exception in thread "main" java.lang.AbstractMethodError: oracle.jdbc.driver.T4CCallableStatement.getParameterMetaData()Ljava/sql/ParameterMetaData;
      

  7.   

    当然试过,没什么问题噢,因为我正在用这个东西,目前,现在。
    ParameterMetaData pmd=this.prepared.getParameterMetaData();
      

  8.   

    你用的是oracle驱动吗,哪个版本的
      

  9.   

    当然是oracle啦,9i版本的。
    我估计是你的驱动包版本不对或是其它原因。
      

  10.   

    9i版本的oracle用9i版本的驱动包,版本要对应,一般什么版本的oracle,oracle安装目录下就有相应版本的驱动包,不要用异版本的驱动包,不然会出问题的,即使版本号只差0.001,因为我出国这种问题让客户郁闷了好一阵子,让我经理急了好一阵子。
      

  11.   

    连库的接口(应该叫接口吧)有三个,ps是预编译连库的,调用存储过程可以用另外一个接口,好像是c开头的,我忘记了