5.java 调用存储过程 返回一个结果集成功的案例。 final
1.必须使用CallableStatement cs ( 调用存储过程专用的 statment)
2.当存错过程有返回值时,必须先制定 返回值的类型
3.如果返回值类型是一个结果集,那么必须 CallableStatement 的返回参数类型要设置成游标类型的。
cs.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR); //2.因为要返回的类型是
4.然后 从 cs中cs.getObject(1)结果集 ,get结果集时,从1这个索引位置开始get
5.由于存储过程有多个输出参数,所以获得结果集时,可能有多个结果集ReSet,所以,所以cs.getObject(Int resultSetIdx)
//1.pakage 包里面装的是一个游标---------------------------------------------------------------------------------
CREATE OR REPLACE PACKAGE MYPACKAGE
AS TYPE MY_CURSOR IS REF CURSOR; --装结果集用的游标
end MYPACKAGE;
//2.存储过程------------------------------------------------------------------------------------------------------
CREATE OR REPLACE PROCEDURE PRO_3(p_CURSOR out MYPACKAGE.MY_CURSOR) IS
--因为期望存储过程返回一个结果集,然后把结果集转换成LIst,所以 用游标 当返回值,作为输出参数。
BEGIN
OPEN p_CURSOR FOR
SELECT * FROM aaa_test;
END PRO_3;
//3. java调用存储过程的方法------------------------------------------------------------------------------------------------------
private void TestInPutOutPut2() {
//创建用户信息
Session session=getSessionFactory().openSession();
Connection conn = session.connection();
String sql = "{call getNameById(?,?)}";
CallableStatement cs; //1.定义:一个专门用来调用sql语句的statement 变量
ResultSet rs;
try {
cs = conn.prepareCall("{ call inv.PRO_3(?) }");
cs.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR); //2.因为要返回的类型是
cs.execute();
if (cs.getObject(1)!=null) {
rs = (ResultSet) cs.getObject(1); //因为一个存储过程可能有多个输出参数,所以
System.out.println(
"发票类型(0:冠名 ,1统印)" + "\t"
+ "往年还是今年(往年:-1 今年0)" + "\t"
+ "季度 1234" + "\t"
+ "月份" + "\t"
+ "数量" + "\t"
+ "主键" + "\t"
+ "备注" + "\t"
);
while (rs.next()) {
System.out.println("\t" + rs.getString(1) + "\t"
+ rs.getString(2) + "\t"
+ rs.getString(3) + "\t"
+ rs.getString(4) + "\t"
+ rs.getString(5) + "\t"
+ rs.getString(6) + "\t"
+ rs.getString(7) + "\t"
);
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
posted on 2014-01-05 13:09 fantiejun0436 阅读(200) 评论(0) 收藏 举报
浙公网安备 33010602011771号