最近在學習Mysql存儲過程,寫了一個分頁的Demo,記錄一下。
該存儲過程用於返回表中總記錄數,會在分頁的存儲過程中調用它。 /*查詢表中記錄總條目數*/ DELIMITER $ DROP PROCEDURE IF EXISTS proc_count; CREATE PROCEDURE proc_count(tab_name VARCHAR(100),OUT num FLOAT(10)) BEGIN SET @tabSql = CONCAT('SELECT COUNT(*) INTO @Total FROM ',tab_name);/*此處 @Total爲 記錄的總條目數*/ PREPARE tabSql FROM @tabSql; EXECUTE tabSql; SET num = @Total;/*將Total變量的值賦給num,並在調用該存儲過程時OUT*/ END $ DELIMITER ;
該存儲過程爲分頁的邏輯,參數說明: tab(表的名稱),startItem (查詢第幾頁),pageSize (每頁查詢的條目數), sortRule (排序規則“asc”或"desc",若無需排序輸入 ‘ ’ ), order_field (要排序的字段,若無需排序輸入 ‘ ’),totalElements (輸出表中總記錄數量), pageCount (按當前每頁查詢條目數,所計算出的頁碼總數) DELIMITER $ DROP PROCEDURE IF EXISTS proc_page; CREATE PROCEDURE proc_page ( tab VARCHAR(100), startItem INT(10), pageSize INT(10), sortRule VARCHAR(100), order_field VARCHAR(100), OUT totalElements INT(10), OUT pageCount INT(10)) BEGIN CALL proc_count(tab,@param);/*調用上面的存儲過程,得到表中總記錄數*/ SET totalElements = @param; SET pageCount = CEIL(totalElements/pageSize);/*頁碼數=總條目數/每頁條目數*/ IF sortRule <> ' ' THEN /*判斷是否需要排序*/ IF sortRule = 'asc' THEN SET @pageSql = CONCAT( 'SELECT * FROM ', tab, ' ORDER BY ', order_field, ' asc ', ' LIMIT ', (startItem - 1) * pageSize, ' , ' , pageSize ) ; ELSE SET @pageSql = CONCAT( 'SELECT * FROM ', tab, ' ORDER BY ', order_field, ' desc ', ' LIMIT ', (startItem - 1) * pageSize, ' , ' , pageSize ) ; END IF; ELSE SET @pageSql = CONCAT('SELECT * FROM ' ,tab, ' LIMIT ' ,(startItem - 1) * pageSize, ' , ' ,pageSize); END IF; PREPARE pageSql FROM @pageSql; EXECUTE pageSql; END $ DELIMITER ; 調用該存儲過程: CALL proc_page('people',4,1000,'asc','id',@totalElements,@pageCount); /*表名,起始記錄,條目數,排序的方式或空,排序的字段或空,總條目數,總頁碼數*/ SELECT @totalElements,@pageCount;
本想把這個分頁的存儲過程用到項目中,但是公司項目用的是SpringBoot + JPA,由於EJB3不能調用以OUT參數返回值的存儲過程所以就gg了。如果朋友們有什麼好的解決辦法,可以留言告訴我一下,大家共同學習。