CREATE OR REPLACE PROCEDURE PROC_PageDivider
(PERROWS NUMBER:=4,DISPLAYPAGE NUMBER:=1)
                                  --TABLENAME要分页的表名
                                  --PERROWS每页显示的行数
                                  --DISPLAYPAGE要显示的页码
IS
       SQL_SELECT VARCHAR2(200);                    --查询语句
       PAGESIZE NUMBER;                             --页数
       TOTALROWS NUMBER;                            --总共行数
BEGIN
       SELECT COUNT(*) INTO TOTALROWS FROM STUDENT;   --要用动态SQL
       IF TOTALROWS%PERROWS <>0 THEN
          PAGESIZE:=TOTALROWS/PERROWS+1;
       ELSE
          PAGESIZE:=TOTALROWS/PERROWS;
       END IF;
       SELECT * FROM STUDENT WHERE ID<=(DISPLAYPAGE-1)*PERROWS
       MINUS
       SELECT * FROM STUDENT WHERE ID<=DISPLAYPAGE*PERROWS;
END;我这样执行怎么会有错:
EXCUTE IMMEDIATE PROC_PageDivider 5,2

解决方案 »

  1.   

    oracle存储过程中不允许直接用单纯的select语句的,你需要先定义一个指示游标
      

  2.   

    create pakage pg_test
    is 
    type ref_cur is ref ursor;
    end;
      

  3.   

    CREATE OR REPLACE PROCEDURE PROC_PageDivider(PERROWS NUMBER,DISPLAYPAGE NUMBER,aa pg_test.ref_cur)
    is
    begin
    ......;
    open aa for 
           SELECT ...
           MINUS
           SELECT ...;
    END;
      

  4.   

    改成这样还是有错:
    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;
      

  5.   

    http://www.xh668.com/bbs/thread-4873-1-1.html