您的位置:首页 > 数据库 > Oracle

Java 开发中之八:oracle中的子程序之在JAVA中如何调用程序包

2012-12-11 22:14 651 查看
--程序包:解决集合数据的获取
--引用类型游标+函数/存储过程:
--包的创建(包的声明+实现)
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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: