网站地图    收藏   

主页 > php专栏 > php分页 >

mysql 分页存储过程实例

来源:未知    时间:2014-11-27 22:50 作者:xxadmin 阅读:

[导读] 本文章收集了四款mysql 分页存储过程实例代码,有高效的分页存储过程以及入门级的和通用的存储过程分页代码,如果你正在学mysql分页存储过程就进来看看吧. mysql测试版本:5.0.41-commun...

本文章收集了四款mysql 分页存储过程实例代码,有高效的分页存储过程以及入门级的和通用的存储过程分页代码,如果你正在学mysql分页存储过程就进来看看吧.

mysql测试版本:5.0.41-community-nt,mysql分页存储过程

  1. drop procedure if exists pr_pager; 
  2. create procedure pr_pager( 
  3.     in     p_table_name        varchar(1024),        /*表名*/ 
  4.     in     p_fields            varchar(1024),        /*查询字段*/ 
  5.     in     p_page_size            int,                /*每页记录数*/ 
  6.     in     p_page_now            int,                /*当前页*/ 
  7.     in     p_order_string        varchar(128),        /*排序条件(包含order关键字,可为空)*/ 
  8.     in     p_where_string        varchar(1024),        /*where条件(包含where关键字,可为空)*/ 
  9.      out     p_out_rows            int                    /*输出记录总数*/ 
  10.      
  11.     not deterministic 
  12.      sql security definer 
  13.      comment '分页存储过程' 
  14.      
  15. begin 
  16.     /*定义变量*/ 
  17.     declare m_begin_row int default 0; 
  18.     declare m_limit_string char(64); 
  19.     /*构造语句*/     
  20.     set m_begin_row = (p_page_now - 1) * p_page_size; 
  21.     set m_limit_string = concat(' limit ', m_begin_row, ', ', p_page_size); 
  22.      
  23.     set @count_string = concat('select count(*) into @rows_total from ', p_table_name, ' ', p_where_string); 
  24.     set @main_string = concat('select ', p_fields, ' from ', p_table_name, ' ', p_where_string, ' ', p_order_string, m_limit_string); 
  25.     /*预处理*/ 
  26.     prepare count_stmt from @count_string; 
  27.     execute count_stmt; 
  28.     deallocate prepare count_stmt; 
  29.     set p_out_rows = @rows_total; 
  30.     prepare main_stmt from @main_string; 
  31.     execute main_stmt; 
  32.     deallocate prepare main_stmt; 
  33.      
  34. end 

一款高效的存储过程分页代码,存储过程分页的基本原理:我们先对查找到的记录集(支持输入查找条件_whereclause和排列条件_orderby)的key字段临时存放到临时表,然后构建真正的记录集输出.

  1. create   procedure   `mysqltestuser_select_pageable`(  
  2.         _whereclause   varchar(2000),     --   查找条件  
  3.         _orderby   varchar(2000),     --   排序条件  
  4.         _pagesize     int   ,       --   每页记录数  
  5.         _pageindex   int   ,     --   当前页码  
  6.         _docount       bit       --   标志:统计数据/输出数据  
  7. )  
  8.         not   deterministic  
  9.         sql   security   definer  
  10.         comment   ' '  
  11. begin  
  12.   --   定义key字段临时表  
  13.   drop   table   if   exists   _temptable_keyid;     --   删除临时表,如果存在  
  14.   create   temporary     table     _temptable_keyid  
  15.   (  
  16. userid   int  
  17.   )type=heap; 
  18.   --   构建动态的sql,输出关键字key的id集合  
  19.   --   查找条件  
  20.   set   @sql   =   'select     userid   from   mysqltestuser ';  
  21.   if   (_whereclause   is   not   null)     and   (_whereclause   <>   ' ')   then  
  22.   set   @sql=   concat(@sql,   '   where   '   ,_whereclause);  
  23.   end   if
  24.   if   (_orderby   is   not   null)     and     (_orderby   <> ' ')   then  
  25.   set   @sql=   concat(   @sql   ,   '   order   by   '   ,   _orderby);  
  26.   end   if
  27.   --   准备id记录插入到临时表  
  28.   set   @sql=concat( 'insert   into   _temptable_keyid(userid) ',   @sql);  
  29.   prepare   stmt   from   @sql;  
  30.   execute   stmt   ;  
  31.   deallocate   prepare   stmt;  
  32. --   key的id集合     [end
  33. --   下面是输出  
  34. if   (_docount=1)   then     --   统计  
  35.           begin  
  36.                     select   count(*)   as   recordcount   from   _temptable_keyid;  
  37.           end;  
  38. else                                   --   输出记录集  
  39.           begin  
  40.                   --   计算记录的起点位置  
  41.   set   @startpoint   =   ifnull((_pageindex-1)*_pagesize,0);  
  42.                   set   @sql= '                 select           a.*  
  43.       from       mysqltestuser   a  
  44.       inner   join   _temptable_keyid   b  
  45.       on     a.userid   =b.userid     '; 
  46.   set   @sql=concat(@sql, "     limit     ",@startpoint, "   , ",_pagesize);  
  47.                   prepare   stmt   from   @sql;  
  48.   execute   stmt   ;  
  49.   deallocate   prepare   stmt;  
  50.           end;  
  51. end   if
  52.   drop   table   _temptable_keyid;  
  53. end

下面是mysqltestuser表的ddl:

  1. create   table   `mysqltestuser`   (  
  2.     `userid`   int(11)   not   null   auto_increment,  
  3.     `name`   varchar(50)   default   null,  
  4.     `chinesename`   varchar(50)   default   null,  
  5.     `registerdatetime`   datetime   default   

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论