CREATE PROCEDURE DB2ADMIN.PROC_GETPAGE
(INOUT CURRENTPAGE INTEGER,
IN STRSQL VARCHAR(500),
IN PAGESIZE INTEGER,
OUT TOTALPAGE INTEGER,
OUT TOTALRECORD INTEGER
)
SPECIFIC DB2ADMIN.SQL080201103307110
DYNAMIC RESULT SETS 1
LANGUAGE SQL
NOT DETERMINISTIC
CALLED ON NULL INPUT
READS SQL DATA
INHERIT SPECIAL REGISTERS
BEGIN
DECLARE tmpsql VARCHAR(1000); -- 主语句
DECLARE orderFiled VARCHAR(50);
DECLARE s VARCHAR(1000);
DECLARE v_Start INTEGER;
DECLARE v_End INTEGER;
DECLARE result CURSOR WITH RETURN TO CALLER FOR S2;
SET orderFiled =getOrderField(strsql);
if(length(orderFiled )>0) then
set orderFiled =' order by ' || orderFiled ;
end if;
SET s =getSQL(strsql);
set tmpsql = 'select count(*) from (' || strsql || ') as a';
prepare s2 from tmpsql;
open result;
fetch result into totalrecord;-- 总记录数
close result;
if(pagesize = 0) then
set pagesize = 20;-- 每页显示数
end if;
if(currentPage < 1) then
set currentPage = 1;-- 当前页
else
if(currentPage > totalPage) then
set currentPage = totalPage;
end if;
end if;
set v_Start = (currentPage-1) * pagesize ;
set v_End = currentPage * pagesize;
set tmpsql ='select * from ' ||
'(select rownumber() over() as row, ' ||
'w.* from ( select * from ( ' || s || ') n ' || orderFiled || ') w) w1 where row between ' || char(v_Start ) || ' and ' || char(v_End );
prepare s2 from tmpsql ;
open result;
END;
使用了两个java函数
import java.util.regex.*;
import COM.ibm.db2.app.UDF;
public class FunctionDB2 extends UDF
{
public static String getOrderField(String sql)
{
Pattern Regex = Pattern.compile("select(.+)order\\s*by\\s*(.+)",
Pattern.CANON_EQ | Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
Matcher RegexMatcher = Regex.matcher(sql);
if (RegexMatcher.find()) {
return RegexMatcher.group(2);
}
return "";
}