zoukankan      html  css  js  c++  java
  • MySql 分页存储过程

    DELIMITER $$ #改动分隔符为 $$
    DROP PROCEDURE IF EXISTS sp_MvcCommonDataSource$$ #分隔符
    CREATE PROCEDURE sp_MvcCommonDataSource (
    	#输入參数
    	_fields VARCHAR(2000), #要查询的字段,用逗号(,)分隔
    	_tables TEXT,  #要查询的表
    	_where VARCHAR(2000),   #查询条件
    	_orderby VARCHAR(200),  #排序规则
    	_pageindex INT,  #查询页码
    	_pageSize INT,   #每页记录数
    	_sumfields VARCHAR(200),#求和字段
    	#输出參数
    	OUT _totalcount INT,  #总记录数
    	OUT _pagecount INT,    #总页数
    	OUT _sumResult VARCHAR(2000)#求和结果
    )
    BEGIN
    	#140529-xxj-分页存储过程
    	#计算起始行号
    	SET @startRow = _pageSize * (_pageIndex - 1);
    	SET @pageSize = _pageSize;
    	SET @rowindex = 0; #行号
    
    	#合并字符串
    	SET @strsql = CONCAT(
    		#'select sql_calc_found_rows  @rowindex:=@rowindex+1 as rownumber,' #记录行号
    		'select sql_calc_found_rows '
    		,_fields
    		,' from '
    		,_tables
    		,CASE IFNULL(_where, '') WHEN '' THEN '' ELSE CONCAT(' where ', _where) END
    		,CASE IFNULL(_orderby, '') WHEN '' THEN '' ELSE CONCAT(' order by ', _orderby) END
    	  ,' limit ' 
    		,@startRow
    		,',' 
    		,@pageSize
    	);
    
    	PREPARE strsql FROM @strsql;#定义预处理语句 
    	EXECUTE strsql;							#运行预处理语句 
    	DEALLOCATE PREPARE strsql;	#删除定义 
    	#通过 sql_calc_found_rows 记录没有使用 limit 语句的记录,使用 found_rows() 获取行数
    	SET _totalcount = FOUND_ROWS();
    
    	#计算总页数
    	IF (_totalcount <= _pageSize) THEN
    		SET _pagecount = 1;
    	ELSE IF (_totalcount % _pageSize > 0) THEN
    		SET _pagecount = _totalcount / _pageSize + 1;
    	ELSE
    		SET _pagecount = _totalcount / _pageSize;
    	END IF;
    	END IF;
    
    	#计算求和字段
    	IF (IFNULL(_sumfields, '') <> '') THEN
    		#序列sum结果
    		SET @sumCols = CONCAT (
    			'CONCAT_WS(',','
    			,'SUM('
    			,REPLACE(_sumfields,',','),SUM(')
    			,'))');
    		#拼接字符串
    		SET @sumsql = CONCAT(
    			'select '
    			,@sumCols
    			,' INTO @sumResult from '
    			,_tables
    			,CASE IFNULL(_where, '') WHEN '' THEN '' ELSE CONCAT(' where ', _where) END
    			,';'
    		);
    		#select @sumsql;
    		PREPARE sumsql FROM @sumsql;#定义预处理语句 
    		EXECUTE sumsql;	
    		SET _sumResult = @sumResult;						#运行预处理语句 
    		DEALLOCATE PREPARE sumsql;	#删除定义 
    
    	END IF;
    
    END$$
    DELIMITER ; #改动分隔符为分号(;)
    
    
    ##################################################
    # 測试存储过程
    #select order_no,order_date,order_type from `order`;
    
    CALL sp_MvcCommonDataSource(
    'order_no,order_date,order_type'#查询字段
    ,'`order`'#表名
    ,'1=1'#条件
    ,'order_no asc'#排序
    ,2 #页码
    ,3 #每页记录数
    ,'order_no,order_no'#求和字段
    ,@totalcount #输出总记录数
    ,@pagecount #输出用页数
    ,@sumResult #求和结果
    );
    SELECT @totalcount,@pagecount,@sumResult;


  • 相关阅读:
    洛谷p1017 进制转换(2000noip提高组)
    Personal Training of RDC
    XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Eurasia
    XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Peterhof.
    Asia Hong Kong Regional Contest 2019
    XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Siberia
    XVIII Open Cup named after E.V. Pankratiev. Ukrainian Grand Prix.
    XVIII Open Cup named after E.V. Pankratiev. GP of SPb
    卜题仓库
    2014 ACM-ICPC Vietnam National First Round
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/3807640.html
Copyright © 2011-2022 走看看