存储过程 out参数返回集合(游标),放在包中:
/*
1、查询某个员工的所有信息 ---> out参数太多
2、查询某个部门中的所有员工信息 ----> 返回的是集合
*/
--查询某个部门中的所有员工信息 ----> 返回的是集合(整个一条记录)
--包头(打包,作为一个整体编译)
create or replace package mypackage is
type empcursor is ref cursor; --自定义类型。其实就是游标类型(集合)
procedure queryEmpList(dno in number,empList out empcursor); --声明存储过程、存储函数
end mypackage;
/
--包体(实现包头中声明的存储过程、存储函数)
create or replace package body mypackage is
procedure queryEmpList(dno in number,empList out empcursor)
as
begin
open empList for select * from emp where deptno=dno; --empList其实是光标(集合)类型,需要open。 由调用者关闭光标
end;
end mypackage;
/
TestOracle.java(Java中调用存储过程,out参数返回集合(游标)):
package demo;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import oracle.jdbc.OracleCallableStatement;
import oracle.jdbc.OracleTypes;
import org.junit.Test;
public class TestOracle {
@Test
//存储过程返回的是一个集合(游标)
public void testCursor(){
String sql = "{call mypackage.QUERYEMPLIST(?,?)}"; //调用包mypackage中的存储过程
Connection conn = null;
CallableStatement call = null;
ResultSet rs = null; //存放存储过程的out参数返回的集合(游标)
try {
conn = JDBCUtils.getConnection();
call = conn.prepareCall(sql);
//对于in参数,赋值
call.setInt(1,20);
//对于out参数,声明
call.registerOutParameter(2, OracleTypes.CURSOR); //游标(集合)类型
//执行
call.execute();
//取出结果(集合,游标)
rs = ((OracleCallableStatement)call).getCursor(2); //2表示存储过程中的第二个?号
while(rs.next()){
//取出一个员工
String name = rs.getString("ename");
double sal = rs.getDouble("sal");
System.out.println(name+"\t"+sal);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
JDBCUtils.release(conn, call, rs); //关闭ResultSet,就会关闭光标。
}
}
}
JDBCUtils.java(Oracle数据库连接工具类):
package demo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCUtils {
private static String driver = "oracle.jdbc.OracleDriver";
private static String url = "jdbc:oracle:thin:@192.168.137.129:1521/数据库名";
private static String user = "scott";
private static String password = "tiger";
static{
//注册驱动
//DriverManager.registerDriver(driver) //会导致注册两次驱动,且依赖于驱动jar包
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
throw new ExceptionInInitializerError(e);
}
}
//获取数据库连接
public static Connection getConnection(){
try {
return DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
//释放资源
public static void release(Connection conn,Statement st,ResultSet rs){
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}finally{
rs = null;
}
}
if(st != null){
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}finally{
st = null;
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}finally{
conn = null;
}
}
}
}