Erp100论坛's Archiver

xiangzhao 发表于 2008-7-12 22:52

Oracle分页存储过程

我写的分页存储过程有问题,请大家帮忙看看:
表结构:
STUDENT
(
       ID NUMBER,
       NAME VARCHAR2(10)
)

CREATE OR REPLACE PACKAGE PAGE_PAGE IS
TYPE REF_CUR IS REF CURSOR;
PROCEDURE PROC_PageDivider(PERROWS in NUMBER,DISPLAYPAGE in NUMBER,OUTPUTDATA OUT PAGE_PAGE.REF_CUR);
END PAGE_PAGE;

CREATE OR REPLACE PACKAGE BODY PAGE_PAGE AS
PROCEDURE PROC_PageDivider
(                                 
PERROWS in NUMBER,                  --PERROWS每页显示的行数
DISPLAYPAGE in NUMBER,              --DISPLAYPAGE要显示的页码
OUTPUTDATA OUT PAGE_PAGE.REF_CUR    --返回的数据集
)
IS
       SQL_SELECT VARCHAR2(200);                    --查询语句
       PAGESIZE NUMBER;                             --页数
       TOTALROWS NUMBER;                            --总共行数
BEGIN
       SELECT COUNT(*) INTO TOTALROWS FROM STUDENT;
       IF TOTALROWS mod PERROWS <>0 THEN
          PAGESIZE:=TOTALROWS/PERROWS+1;
       ELSE
          PAGESIZE:=TOTALROWS/PERROWS;
       END IF;
       OPEN OUTPUTDATA FOR
       SELECT * FROM STUDENT WHERE ID<=(DISPLAYPAGE-1)*PERROWS
       MINUS
       SELECT * FROM STUDENT WHERE ID<=DISPLAYPAGE*PERROWS;
END PROC_PageDivider;

xiangzhao 发表于 2008-7-12 22:52

1、包体的最后加一行  end;
2、SELECT * FROM STUDENT WHERE ID<=(DISPLAYPAGE-1)*PERROWS
     MINUS
     SELECT * FROM STUDENT WHERE ID<=DISPLAYPAGE*PERROWS;
    改成
   SELECT * FROM STUDENT WHERE rownum<=DISPLAYPAGE*PERROWS
     MINUS
     SELECT * FROM STUDENT WHERE rownum<=(DISPLAYPAGE-1)*PERROWS;
3、给过程加个 exception 会更好
    if DISPLAYPAGE > PAGESIZE then

页: [1]

Powered by Discuz! Archiver 7.0.0  © 2001-2007 Comsenz Inc.