java.sql.Types的类型都可以使用
cs.registerOutParameter(1,Type_java.sql.Types);
比如NUMBER
cs.registerOutParameter(1,Type_NUMBERIC);
cs.registerOutParameter(1,Type_java.sql.Types);
比如NUMBER
cs.registerOutParameter(1,Type_NUMBERIC);
用的时候前面加Type_
比如:VARCHAR
cs.registerOutParameter(1,Type_VARCHAR);
没有的你只能转换
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;
}
"{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);//
象Statement里面就有游标参数的,可以能让你的记录集指针滚到最后一条记录的后面,我看你要做查询的话不要用CallableStatement执行存储过程了,用Statement来执行存储过程,你就可以用游标参数了,rs.afterLast();这个就是指针滚到最后一条记录后面
stmt.executeQuery("{call getTestData('"+参数1+"','"+参数2+"')}");
也可以传进参数的,好象就是取不到返回的参数,这个我都一直用的,
这样你就可以用游标了,一般你要游标也是执行查询的存储过程,上面的就够了
如果是更新用executeUpdate。
不信你试试,保证成功,我觉得这可能是一种非正式的用法吧,但是肯定行的,我估计Statement和CallableStatement在最终的实现细节上是一样的,只不过是封装的不同方法而已,只要你的SQL语句不错,都可以接受并执行,就是Statement拿不到返回的参数,你有兴趣可以看看JDBC中的类文件,一看就明白了是怎么回事了。
有高手的话可以指正,洗耳恭听。
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()都没有问题了。