8.分页的存储过程

分页的存储过程

(1)简单的分页存储过程

-----------------------分页存储过程-----------------------------------------------

--①申明包---

--②编写存储过程--

 

-- 申明了一个包  和 java中的包是一样的概念 --

create or replace package pack_page is

  -- 在包中自定义一个类型 --

  type page_cursor is ref cursor ;--定义游标

end pack_page;

 

-- 分页存储过程 --

create or replace procedure proc_owner_page

(

  page number,-- 当前页码

  pageSize number,-- 每页大小

  total out number, -- 总条数

  datas out pack_page.page_cursor -- 查询的数据,输出的是一个游标

)

is

 v_start number;

 v_sql varchar(200 char);

begin

  -- 查询总条数 --

  select count(*) into total from t_owners;

  -- 查询数据 --

  v_start := (page-1)*pageSize;

  v_sql := 'select * from (select o.*,rownum r from t_owners o) d where d.r >='||v_start||'  and d.r < '||(v_start+pageSize);

  open datas for v_sql ;

end;

 

 

Junit测试

@Test

   public void testQueryBypage() throws Exception {

      Connection con=getCon();

      String sql = "{call proc_owner_page(?,?,?,?)}";

      CallableStatement cst=con.prepareCall(sql);

      //设置输入参数

      cst.setInt(1, 2);

      cst.setInt(2, 5);

      //输出参数要注册

      cst.registerOutParameter(3, OracleTypes.NUMBER);

      cst.registerOutParameter(4, OracleTypes.CURSOR);

      //执行存储过程

      cst.execute();

      //取出输出参数的值

      int total = cst.getInt(3);

      System.out.println("总共查询到:"+total+"条数据");

      ResultSet rs = (ResultSet) cst.getObject(4);

      while(rs.next()) {

         System.out.println("id:"+rs.getInt("id")+";name:"+rs.getString("name"));

      }

      cst.close();

      con.close();

     

   }

结果:

(2)实际开发中完整的分页存储过程

-- 实际开发中完整的分页存储过程 --

create or replace procedure proc_page

(

  tname varchar2 ,-- 要分页查询的表名称--

  page number,--当前的页码--

  pageSize number,-- 每页大小--

  term varchar2,-- 查询条件 --

  total out number,-- 查询的数据的总条数--

  maxPageNum out number,-- 最大页码 --

  datas out pack_page.page_cursor -- 查询的数据,输出的是一个游标 --

)

is

 -- 申明部分 --

 v_sql varchar2(500 char);

 v_start number;

begin

  -- 查询总条数 --

  v_sql := 'select count(*) from '||tname;

  -- 判断是否存在查询条件 --

  if term is not null then

    v_sql := v_sql || ' where '||term;

  end if;

  -- 执行查询总条数的sql --

  EXECUTE IMMEDIATE v_sql into total;

  -- 计算最大页码 --

  if mod(total,pageSize) <> 0 then

    maxPageNum := total/pageSize+1;

  else

    maxPageNum := total/pageSize;

  end if;

  -- 开始查询数据 --

  -- 计算开始位置 --

 

    v_start := (page-1)*pageSize;

 

  v_sql := 'select * from(select d.*,rownum r from '||tname||' d';

  -- 判断是否有查询条件 --

  if term is not null then

    v_sql := v_sql || ' where '||term;

  end if;

  -- 拼接上最后一部分 --

  v_sql := v_sql ||') t where t.r >'||v_start||' and t.r <='||(v_start+pageSize);

 

  dbms_output.put_line(v_sql);

  -- 执行sql语句 --

  open datas for v_sql;

end;

 

Junit测试

@Test

   public void testQueryBypage2() throws Exception {

      Connection con=getCon();

      String sql = "{call proc_page(?,?,?,?,?,?,?)}";

      CallableStatement cst=con.prepareCall(sql);

      //设置输入参数

      cst.setString(1, "t_owners");

      cst.setInt(2, 2);

      cst.setInt(3, 5);

      cst.setString(4, " ownertypeid=1 ");

      //输出参数要注册

      cst.registerOutParameter(5, OracleTypes.NUMBER);

      cst.registerOutParameter(6, OracleTypes.NUMBER);

      cst.registerOutParameter(7, OracleTypes.CURSOR);

      //执行存储过程

      cst.execute();

      //取出输出参数的值

      int total = cst.getInt(5);

      int maxPageNum = cst.getInt(6);

      System.out.println("总共查询到:"+total+"条数据");

      System.out.println("最大页码是:"+maxPageNum);

      //取出游标中的数据

      ResultSet rs = (ResultSet) cst.getObject(7);

      while(rs.next()) {

         System.out.println("id:"+rs.getInt("id")+";name:"+rs.getString("name"));

      }

      cst.close();

      con.close();

     

   }

 

 

 

结果

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个使用 Node.js 操作存储过程分页显示的例子。我们假设你已经成功连接到了 MS SQL Server 数据库,并且有一个名为 `your-procedure-name` 的存储过程,该存储过程接受两个参数 `pageIndex` 和 `pageSize`,并返回一批数据。我们需要编写代码来调用该存储过程分页显示结果。 首先,我们定义每页显示的数据条数和当前页码: ```javascript const pageSize = 10; // 每页显示的数据条数 const pageIndex = 1; // 当前页码 ``` 然后,我们可以使用以下代码来调用存储过程分页显示结果: ```javascript const request = pool.request(); // 定义输入参数 request.input('pageIndex', sql.Int, pageIndex); request.input('pageSize', sql.Int, pageSize); // 执行存储过程 const result = await request.execute('your-procedure-name'); // 处理查询结果 const totalCount = result.recordset[0].totalCount; // 总数据条数 const data = result.recordset.slice(1); // 查询结果数据 // 计算分页信息 const pageCount = Math.ceil(totalCount / pageSize); // 总页数 const startRowIndex = (pageIndex - 1) * pageSize + 1; // 起始行号 const endRowIndex = Math.min(pageIndex * pageSize, totalCount); // 结束行号 // 输出分页信息 console.log(`当前第 ${pageIndex} 页,共 ${pageCount} 页,每页 ${pageSize} 条,共 ${totalCount} 条数据`); console.log(`显示第 ${startRowIndex} 到第 ${endRowIndex} 条数据:`); console.log(data); ``` 在上面的代码中,我们首先使用 `request.input()` 方法来定义输入参数,然后使用 `request.execute()` 方法来执行存储过程。执行结果会以数组形式返回,第一项为总数据条数,后面的项为查询结果数据。我们使用 `slice()` 方法来去掉第一项,只保留查询结果数据。 然后,我们计算分页信息,包括总页数、起始行号、结束行号等,最后输出分页信息和查询结果数据。 当然,实际的存储过程可能需要更多的输入参数和输出参数,需要根据具体的需求进行编写代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值