在存储过程中,有输入的参数也有输出参数,有一个问题是:如果我们要输出的参数特别多,或者说要输出一张表的所有字段,那张表可能有特别多的字段,我们要对每个输出的字段都使用out参数吗?可以是可以,但我们不可能这么做。我们想:能不能像java程序中,能不能定义一个集合或者一个bean容器来包含所有要输出的字段。
下面就使用光标类型的out参数来输出我们需要的数据信息:
我们可以新建一个包:包头和包体
包头:
CREATE OR REPLACE
PACKAGE MYCORSOR AS --创建一个叫mycorsor的包
type user_cursor is ref cursor; --定义一个cursor类型的user_cursor
procedure queryuserlist(userlist out user_cursor); --创建存储过程,输出cursor类型userlist
END MYCORSOR;
包体:
CREATE OR REPLACE
PACKAGE BODY MYCORSOR AS
procedure queryuserlist(userlist out user_cursor) AS
BEGIN
open userlist for select * from TB_USER; --打开光标
END queryuserlist;
END MYCORSOR;
然后在应用程序调用这个存储过程
package jdbc.test;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import org.junit.Test;
import jdbc.utils.JDBCUtils;
import oracle.jdbc.driver.OracleCallableStatement;
import oracle.jdbc.driver.OracleTypes;
public class testCursor {
@Test
public void testcursor() {
String sql = "{call MYCORSOR.queryuserlist(?)}";//包名.存储过程
Connection conn = null;
CallableStatement call = null;
ResultSet rs = null;
try {
conn = JDBCUtils.getConn();
call = conn.prepareCall(sql);
call.registerOutParameter(1, OracleTypes.CURSOR);
call.execute();
rs = ((OracleCallableStatement) call).getCursor(1);--得到输出内容
while (rs.next()) {
System.out.println("id=" + rs.getString("id") + "姓名为:" + rs.getString("name") + "年龄为"
+ rs.getString("age") + "月薪为" + rs.getString("money"));
}
} catch (Exception e) {
// TODO: handle exception
} finally {
JDBCUtils.release(conn, call, rs);--释放资源
}
}
}