DB2中翻頁存儲(chǔ)過程實(shí)例
使用DB2數(shù)據(jù)庫的過程中,存儲(chǔ)過程是一定會(huì)遇到的問題,本文將為您詳細(xì)解疑DB2數(shù)據(jù)庫中翻頁存儲(chǔ)過程,供您參考,希望能對(duì)您有所啟迪。
CREATE PROCEDURE KYJT.USP_A_FY(IN PTBLNAME VARCHAR(1000), --表名
IN PSHOWNAME VARCHAR(1000), -- 需要顯示字段名
IN PFLDNAME VARCHAR(1000), --字段名(主表主鍵,不可重復(fù))
IN PPAGESIZE INTEGER, -- 頁尺寸 如果為0 默認(rèn)返回前一千萬條數(shù)據(jù) 可以認(rèn)為是返回所有數(shù)據(jù)
IN PPAGEINDEX INTEGER,--頁碼
IN PORDERTYPE INTEGER, --設(shè)置排序類型, 非 0 值則降序(按主鍵排序)
IN PSTRWHERE VARCHAR(1000) --查詢條件 (注意: 不要加 WHERE)
)
MODIFIES SQL DATA
DETERMINISTIC
LANGUAGE SQL
BEGIN
/**//*----------------------------------------------------------------
* Copyright (C) 2006 笑瘋
* 版權(quán)所有。
*
* 過程功能描述:
* 多功能通用翻頁查詢語句(DB2)
*
* 創(chuàng)建標(biāo)識(shí):longping520@126.com(2006-5-1修改)
* #p#
//-----------------------------------------------------------------------*/
DECLARE C_STRSQL VARCHAR(6000); -- 主語句
DECLARE C_STRTMP VARCHAR(100); -- 臨時(shí)變量
DECLARE C_STRORDER VARCHAR(400); -- 排序類型
DECLARE bill_task CURSOR WITH RETURN TO CALLER FOR S1;
--SET PSHOWNAME = PSHOWNAME || ',' || PFLDNAME;
IF (PPAGEINDEX=0) THEN
SET PPAGEINDEX = 1;
END IF;
IF (PPAGESIZE=0) THEN
SET PPAGESIZE = 10000000;
END IF;
-- 設(shè)置排序規(guī)則
IF (PORDERTYPE<>0) THEN
SET C_STRTMP = '<(SELECT MIN';
SET C_STRORDER = ' ORDER BY ' || PFLDNAME || ' DESC';
ELSE
SET C_STRTMP = '>(SELECT MAX';
SET C_STRORDER = ' ORDER BY ' || PFLDNAME || ' ASC';
END IF;#p#
--
SET C_STRSQL = 'SELECT ' || PSHOWNAME || ' FROM '|| PTBLNAME || ' WHERE ' || PFLDNAME || ' ' || C_STRTMP || '( '|| 'TBLTMP.TTT ) FROM (SELECT ' || PFLDNAME || ' AS TTT FROM ' || PTBLNAME || ' ' || C_STRORDER || ' FETCH FIRST ' || CHAR((PPAGEINDEX-1)*PPAGESIZE) || ' ROWS ONLY) AS TBLTMP)' || C_STRORDER || ' FETCH FIRST ' || CHAR(PPAGESIZE) || ' ROWS ONLY';
--
IF (PSTRWHERE <> '') THEN
SET C_STRSQL = 'SELECT ' || PSHOWNAME || ' FROM '|| PTBLNAME || ' WHERE ' || PFLDNAME || ' ' || C_STRTMP || '( '|| 'TBLTMP.TTT ) FROM (SELECT ' || PFLDNAME || ' AS TTT FROM ' || PTBLNAME || ' WHERE ' || PSTRWHERE || ' '|| C_STRORDER || ' FETCH FIRST ' || CHAR((PPAGEINDEX-1)*PPAGESIZE) || ' ROWS ONLY) AS TBLTMP) AND ' || PSTRWHERE || ' ' || C_STRORDER || ' FETCH FIRST ' || CHAR(PPAGESIZE) || ' ROWS ONLY';
END IF;
--
IF (PPAGEINDEX=1) THEN
SET C_STRTMP = '';
IF (PSTRWHERE <> '') THEN
SET C_STRTMP = ' WHERE ' || PSTRWHERE;
END IF;
SET C_STRSQL = 'SELECT ' || PSHOWNAME || ' FROM '|| PTBLNAME || ' ' || C_STRTMP || ' ' || C_STRORDER || ' FETCH FIRST ' || CHAR(PPAGESIZE) || ' ROWS ONLY';
END IF;
PREPARE S1 FROM C_STRSQL;
--OPEN C_STRSQL;
--EXECUTE S1;
OPEN bill_task;
END