--程序包:解决集合数据的获取
--引用类型游标+函数/存储过程:
--包的创建(包的声明+实现)
create or replace package mypack
as
--类似于编写接口
--创建引用型的游标(制作返回值类型,只在这个包里有效)
type myttt is ref cursor return emp%rowtype ;--如果有返回值则是强类型
--首先写函数,其实考虑存储过程
function f2 (dno number) return myttt;--返回一个游标,这样返回的就不是一个单值了。
end mypack ;
--程序包:解决集合数据的获取
create or replace package body mypack --包体相关于接口的实现
as
function f2 (dno number) return myttt
is --因为上面有as了,所以这里写is
ttt myttt;
begin
open ttt for select * from emp where emp.deptno=dno; --只有给游标时才没有Into,其它都给写上into
return ttt;
end;
end;
用pl/sql块接这个游标
declare
eee mypack.myttt;
empr emp%rowtype;
begin
eee:=scott.mypack.f2(30);
loop
fetch eee into empr;
exit when eee%notfound;
dbms_output.put_line(empr.ename);
end loop;
end;
JAVA中调这个包体
Connection connection=null;
CallableStatement statement=null;
OracleConnection conn=null;
try
{
Class.forName("oracle.jdbc.driver.OracleDriver");
//DriverManager.registerDriver("oracle.jdbc.driver.OracleDriver");
String url="jdbc:oracle:thin:@127.0.0.1:1521:ORCL";
String user="scott";
String password="tiger";
//下面是標準的的連接對象
//connection= DriverManager.getConnection(url, user, password);
//下面是在標準的連接不上時可以考慮的
conn=(OracleConnection) DriverManager.getConnection(url, user, password);
String strsql="{?=call mypack.f2(?)}";
statement= conn.prepareCall(strsql);
statement.setInt(2, 20);
statement.registerOutParameter(1,OracleTypes.CURSOR);
statement.execute();
ResultSet rSet= (ResultSet) statement.getObject(1);
while(rSet.next()){
System.out.println(rSet.getInt(1)+","+rSet.getString(2));
}
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
finally
{
if(conn!=null)
{
conn.close();
}
if(connection!=null){
connection.close();
}
if(statement!=null){
statement.close();
}
}