PL/sql分页

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;

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值