PL/sql分页
分页时任何网页几乎都要用到的,所以学习分页很重要。
无返回值的存储过程:
in//表示是一个输入参数,out 表示是一个输出
create or replace procedure lk_pro(bookIdin number,bookname varchar2,publishname varchar2) is
begin
inster into bookvalues(bookId,bookname,publisname);
end;
JAVA调用存储过程
1. 加载驱动
Clsass.forName.(oracle.jdbc.driver,OracleDriver);
Connection ct=DriverManager.getConnection(“jdbc:oracle:thin:@loaclhost:1521:数据库名称”,”用户名”,”密码”);
2. 创建CallableStatement
CallableStatement cs=ct.prepareCall(“{call lk_pso(?,?,?)}”);//注意有几个参数就写几个?
赋值
cs.setInt(1,10);
cs.setString(2,”葵花宝典”);
cs.setString(3,”东方出版社”);
3. 执行
cs.execute();
记得关闭资源
有返回值的存储过程
create or replace procedure lk_pro( bIdnumber, bookName out varchar2)is
begin
select ename into bookName from books wherebooId=bId;
end;
Java调用
与上面的类似,只有2过程不同
CallableStatement cs=ct.prepareCall(“calllk_pso(?,?)”);
cs.setInt(1,102); //给第一个参数赋值
cs.registerOutParameter(2,oracle.jdbc.OracleTypes.VARCHAR);//给返回值赋值
cs.execute();
String name=cs.getString(2);//取返回值要注意?的顺序
如果要返回多个值,在procedure增加返回值,并且在java中关联赋值
返回结果集
oracle存储过程没有返回值,他是通过带有out参数来代替的,列表也不例外。但是由于时集合,所以不能用一般的参数,必须要用pagkage
1. 建立包,定义游标
createor replace package lk_package AS
TYPElk_cursor is ref cursor;
endlk_package;
2. 建立存储过程
create or replaceprocedure lk_pro(lkno in number,p_cursor out lk_package.lk_cursor) is
begin
open lk_cursor forselect *from emp where deptno=lkno;
end;
java调用
创建CallableStatement
CallableStatementcs=ct。prepareCall(“{call lk_pro(?,?)}”);
//赋值
cs.setInt(1,10);//第一个参数
cs.registerOutParameter(2,oracle.jdbc.OracleTypes.Cursor);
cs.execute();//执行
//得到结果集
ResultSetrs=( ResultSet)cs.getObject(2);
//循环取出
while(rs.next()){
//对查询的结果处理
}
分页:
sql:
select t1.*,rownum rn from (select * from emp) t1 where rownum<=10;//取出小于10的数据
select* from(select t1.*,rownum rn from (select * from emp) t1 where rownum<10) t2where rn>=6;//取出6到10行的数据
编写分页的存储过程
定义包
createor replace package lk_pack as
typelk_cursor is ref cursor
endlk_pack;
createor replace procedure fenye
(tableNamevarchar2,--表名
pagenewnumber;-- 当前页
pagerownumber,--每页显示的行数
myrowsout number,--总行数
mypagecountout number,--总页数
lk_cursorout lk_package.lk_cursor—返回的记录集
)is
--定义
v_sqlvarchar2(1000);
v_beginnumber:=(pagenow-1)*pagesize+1;
v_endnumber:=pagenow*pagesize;
--执行
v_sql:=’select*(select t1.*,rownum rn from ‘||tablename||’ t1 where rownum<=’||v_end||’)t2 where rn>=’||v_begin||’;’
--把游标和sql语句关联
openlk_cursor for v_sql;
--计算myrows/mypagecount
v_sql:=’selectcount(*) from ‘||tablename’;
--执行sql,并把返回值赋给myrows
executeimmediate v_sql into myrows;
ifmod(myrows,pagesize)=0 then
mypagecount:=myrows/pagesize;
else
mypagecount:= myrows/pagesize+1;
endif;
--关闭游标;
closelk_cursor;
end;
’