java.sql.Types的类型都可以使用
cs.registerOutParameter(1,Type_java.sql.Types);
比如NUMBER
cs.registerOutParameter(1,Type_NUMBERIC);

解决方案 »

  1.   

    不行呀。numberic和number是一种类型吗?转成int也可以用吗?
      

  2.   

    Type_java.sql只包括:ARRAY,BIGINT,BINARY,BIT,BLOB,CHAR,CLOB,DATE ,DECIMAL,DISTINCT ,DOUBLE ,FLOAT,INTEGER,JAVA_OBJECT,LONGVARBINARY ,LONGVARCHAR ,NULL,NUMERIC,OTHER,REAL,REF,SMALLINT ,STRUCT ,TIME,TIMESTAMP,TINYINT,VARBINARY ,VARCHAR这些类型.
    用的时候前面加Type_
    比如:VARCHAR
    cs.registerOutParameter(1,Type_VARCHAR);
    没有的你只能转换
      

  3.   

    看看代码就明白了:)public static String getBillNo(int billType, int entryId, int deptNo) throws DatabaseAccException {
            Connection conn = null;
            CallableStatement cs = null;
            String result = "";
            try {
                DataBaseAcc db = new DataBaseAcc();
                conn = db.buildConnection();
                cs = conn.prepareCall("{ call BillNoPackage.GetBillNo(?,?,?,?) }");
                cs.setInt(1, billType);
                cs.setInt(2, entryId);
                cs.setInt(3, deptNo);
                cs.registerOutParameter(4, java.sql.Types.VARCHAR);
                cs.execute();
                result = cs.getString(4);
            } catch (Exception e) {
                DatabaseAccException dbae = new DatabaseAccException("数据库操作失败!");
                System.err.println("getSequence :" + e);
                throw dbae;
            } finally {
                try {
                    if (cs != null) {
                        cs.close();
                    }
                    if (conn != null) {
                        conn.close();
                    }
                } catch (Exception e) {
                    System.err.println(e);
                }
            }
            return result;
        }
      

  4.   

    CallableStatement cstmt = con.prepareCall(
     "{call getTestData(?, ?)}");//调用存储过程getTestData,后面的两个问号为待传的参数,你需要几个参数,就写几个问号,表示你要传的参数,其中也包括传出的,注意次序。
    cstmt.setByte(1, 25);//传入byte型的参数,
    cstmt.setBigDecimal(2, 83.75);//传入BigDecimal型的参数,,后面的数字表示精度
    cstmt.registerOutParameter(1, java.sql.Types.TINYINT);//注册要传出的参数,注意后面的类型
    cstmt.registerOutParameter(2, java.sql.Types.NUMERIC, 2);//注册要传出的参数,注意后面的类型
    ResultSet rs = cstmt.executeQuery();
    while (rs.next()) {  
     String name = rs.getString(1);//数据库中的第一个字段
     int score = rs.getInt(2);//第二个
     int percentile = rs.getInt(3);//第三个
     System.out.print("name = " + name + ", score = " + score);//输出
     System.out.println(", percentile = " + percentile);//输出
    }
    byte x = cstmt.getByte(1); //接收传出的参数1,就是这个cstmt.registerOutParameter(1, java.sql.Types.TINYINT);//
    java.math.BigDecimal n = cstmt.getBigDecimal(2); //接收传出的参数1,就是这个cstmt.registerOutParameter(2, java.sql.Types.NUMERIC, 2);//
      

  5.   

    我设置了out参数是一个结果集。但是返回的的结果集数据取到最后一条时。reuslt.next()方法就会出错。说是null值错误。不知道为什么?
      

  6.   

    你到最后一条了,你还要rs.next(),记录集指针滚到最后一条记录的后面了,那么那肯定有问题了,如果你仍然想用,那就应该考虑游标的滚动问题了,但我好象没有查到CallableStatement有关游标滚动的参数。
    象Statement里面就有游标参数的,可以能让你的记录集指针滚到最后一条记录的后面,我看你要做查询的话不要用CallableStatement执行存储过程了,用Statement来执行存储过程,你就可以用游标参数了,rs.afterLast();这个就是指针滚到最后一条记录后面
      

  7.   

    可以用Statement执行存储过程马?
      

  8.   

    用oracle的classes12包,存储过程的输出类型可以是cursor
      

  9.   

    Statement可以执行存储过程的
    stmt.executeQuery("{call getTestData('"+参数1+"','"+参数2+"')}");
    也可以传进参数的,好象就是取不到返回的参数,这个我都一直用的,
    这样你就可以用游标了,一般你要游标也是执行查询的存储过程,上面的就够了
    如果是更新用executeUpdate。
    不信你试试,保证成功,我觉得这可能是一种非正式的用法吧,但是肯定行的,我估计Statement和CallableStatement在最终的实现细节上是一样的,只不过是封装的不同方法而已,只要你的SQL语句不错,都可以接受并执行,就是Statement拿不到返回的参数,你有兴趣可以看看JDBC中的类文件,一看就明白了是怎么回事了。
    有高手的话可以指正,洗耳恭听。
      

  10.   

    我查到了CallableStatement 可以带游标参数的,下面是JDK的说明,仔细看看
    public abstract java.sql.CallableStatement prepareCall(java.lang.String sql,
                                                           int resultSetType,
                                                           int resultSetConcurrency)
                                                    throws java.sql.SQLException这样你在prepareCall(java.lang.String sql,int resultSetType,int resultSetConcurrency)这里加上游标类型参数,你的问题就完全解决了,即可以拿回参数又可以滚动,用rs.afterLast()都没有问题了。