Oracle视频中的作业

编写分页过程
要求:编写一个存储过程,要求可以输入表名、每页显示记录数、当前页。返回总记录数、总页数和返回的结果集。

需要注意:
pl/sql中没有取余符号%,只有通过取余函数mod(a,b)来取a取余b


--将每个数据都进行编号
select t1.*,rownum rn from (select * from emp) t1;
--按条件的将符合编号条件的数据输出
select t1.*,rownum rn from (select * from emp) t1 where rownum<=10;
--将一个范围的数据都输出来
select * from (select t1.*,rownum rn from (select * from emp) t1 where rownum<=10) where rn>=6;

//如果关闭游标,则在java中就无法查到数据


pl/sql代码

--创建一个包
create or replace package mapackage as
type ma_cursor is ref cursor;
end mapackage;

--开始编写分页的过程
create or replace procedure sun_fenye
(tableName in varchar2,
pageSizeNum in number,
pageNow in number,
myrows out number,--总记录数
myPageCount out number,--总页数
m_cursor out mapackage.ma_cursor)--返回的结果集
is
--定义部分(如果有就定义,如果没有就直接进入begin部分)
--定义sql语句 字符串
v_sql varchar2(1000);
--定义两个整数
v_begin number:=(pageNow-1)*pageSizeNum+1;
v_end number:=pageNow*pageSizeNum;
begin
  --执行部分
  v_sql:='select * from (select t1.*,rownum rn from (select * from '||tableName||') t1
  where rownum<='||v_end||') where rn>='||v_begin;
  --把游标和sql关联
  open m_cursor for v_sql;
  --计算myrows和myPageCount
  --组织了一个sql
  v_sql:='select count(*) from '||tableName;
  --执行sql语句,并把返回的值赋给myrows
  execute immediate v_sql into myrows;
  --计算myPageCount
  if mod(myrows,pageSizeNum)=0
    then myPageCount:=myrows/pageSizeNum;
    else
      myPageCount:=myrows/pageSizeNum+1;
      end if;
      --关闭游标
      close m_cursor;
      end;



--新的需要:要求按照薪水从低到高排序,然后取出6——10

只需要在排序那改变即可
 v_sql:='select * from (select t1.*,rownum rn from (select * from '||tableName||' order by sal) t1
  where rownum<='||v_end||') where rn>='||v_begin;

猜你喜欢

转载自1124117571.iteye.com/blog/2288665