create or replace package body pack_page--子程序包
is
procedure proc_pageFull--分页的存储过程声明 
                        (p_tableName varchar2,--表名
                         p_pageIndex number,--当前页
                         p_pageSize number,--每页记录数
                         p_pageCount out number,--总页数
                         p_totalCount out number,--总记录数
                         v_cursor out pack_page.page_cursor,--返回的结果集
                         p_where varchar2,--查询条件
                         p_order_key varchar2,--排序关键字(asc,desc)
                         p_order_column varchar2)--排序字段
is
      v_pageIndex number;
      v_pageSize number;
      v_startCurs number;
      v_endCurs number;
      v_sql varchar2(2000);
begin
      v_sql:='select count(*) from'||p_tableName;--||'where 1=1';
      if p_where is not null or p_where <>'' then
         v_sql:=v_sql||' where '||p_where;
      end if;
      execute immediate v_sql into p_totalCount;--查询总记录数
      p_pageCount=ceif(p_totalCount/p_pageSize);--计算总页数
      v_pageSize:=p_pageSize;
      if v_pageSize<0 then
      v_pageSize:=0;
      end if;
      v_pageIndex:=p_pageIndex;
      if v_pageIndex<0 then
      v_pageIndex:=1;
      end if;
      v_startCurs:=(v_pageIndex-1)*v_pageSize+1;
      v_endCurs:=v_pageIndex*v_pageSize;
      v_sql:='select * from (select rownum num,t.* from (select *from'||p_tableName; 
      if p_where is not null or p_where<>'' then
      v_sql:=v_sql||'where'||p_where;
      end if;
      if p_order_column is not null or p_order_column<>'' then
      v_sql:=v_sql||') t where rownum<='||v_endCurs||') where num>='||
      v_startCurs;
      dbms_output.put_line(v_sql);
      open v_cursor for v_sql;
  end proc_pageFull;end pakc_page;
                      
各位大哥帮我看看那里出错了吧

解决方案 »

  1.   


    create or replace package body pack_page--子程序包
    is
    procedure proc_pageFull--分页的存储过程声明  
              (p_tableName varchar2,--表名
              p_pageIndex number,--当前页
              p_pageSize number,--每页记录数
              p_pageCount out number,--总页数
              p_totalCount out number,--总记录数
              v_cursor out pack_page.page_cursor,--返回的结果集
              p_where varchar2,--查询条件
              p_order_key varchar2,--排序关键字(asc,desc)
              p_order_column varchar2)--排序字段
    is
      v_pageIndex number;
      v_pageSize number;
      v_startCurs number;
      v_endCurs number;
      v_sql varchar2(2000);
    begin
         v_sql:='select count(*) from'||p_tableName;--||'where 1=1';
         if p_where is not null or p_where <>'' then
            v_sql:=v_sql||' where '||p_where;
         end if;
         execute immediate v_sql into p_totalCount;--查询总记录数
         
         p_pageCount=ceif(p_totalCount/p_pageSize);--计算总页数
         v_pageSize:=p_pageSize;
         if v_pageSize<0 then
            v_pageSize:=0;
         end if;
         
         v_pageIndex:=p_pageIndex;
         if v_pageIndex<0 then
            v_pageIndex:=1;
         end if;
         
         v_startCurs:=(v_pageIndex-1)*v_pageSize+1;
         v_endCurs:=v_pageIndex*v_pageSize;
         v_sql:='select * from (select rownum num,t.* from (select *from'||p_tableName;  
         if p_where is not null or p_where<>'' then
            v_sql:=v_sql||'where'||p_where;
         end if;
         
         if p_order_column is not null or p_order_column<>'' then
            v_sql:=v_sql||') t where rownum<='||v_endCurs||') where num>='||v_startCurs;
         end if;--这里少了一个end if结束标志
         
         dbms_output.put_line(v_sql);
         open v_cursor for v_sql;
      end proc_pageFull;
    end pakc_page;
      

  2.   

    --先改改语法错误吧,自己再调试一下吧
    CREATE OR REPLACE PACKAGE BODY pack_page --子程序包
     IS
      CREATE      OR REPLACE PROCEDURE proc_pageFull --分页的存储过程声明 
      (p_tableName VARCHAR2, --表名
       p_pageIndex NUMBER, --当前页
       p_pageSize NUMBER, --每页记录数
       p_pageCount OUT NUMBER, --总页数
       p_totalCount OUT NUMBER, --总记录数
       v_cursor OUT SYS_REFCURSOR, --返回的结果集
       p_where VARCHAR2, --查询条件
       p_order_key VARCHAR2, --排序关键字(asc,desc)
       p_order_column VARCHAR2) --排序字段
      IS v_pageIndex NUMBER;
      v_pageSize  NUMBER;
      v_startCurs NUMBER;
      v_endCurs   NUMBER;
      v_sql       VARCHAR2(2000);
    BEGIN
      v_sql := 'select count(*) from' || p_tableName; --||'where 1=1';
      IF p_where IS NOT NULL OR p_where <> '' THEN
        v_sql := v_sql || ' where ' || p_where;
      END IF;
      EXECUTE IMMEDIATE v_sql
        INTO p_totalCount; --查询总记录数
      p_pageCount = ceil(p_totalCount / p_pageSize); --计算总页数
      v_pageSize := p_pageSize;
      IF v_pageSize < 0 THEN
        v_pageSize := 0;
      END IF;
      v_pageIndex := p_pageIndex;
      IF v_pageIndex < 0 THEN
        v_pageIndex := 1;
      END IF;
      v_startCurs := (v_pageIndex - 1) * v_pageSize + 1;
      v_endCurs   := v_pageIndex * v_pageSize;
      v_sql       := 'select * from (select rownum num,t.* from (select *from' ||
                     p_tableName;
      IF p_where IS NOT NULL OR p_where <> '' THEN
        v_sql := v_sql || 'where' || p_where;
      END IF;
      IF p_order_column IS NOT NULL OR p_order_column <> '' THEN
        v_sql := v_sql || ') t where rownum<=' || v_endCurs || ') where num>=' ||
                 v_startCurs;
      END IF; --少了end if
      dbms_output.put_line(v_sql);
      OPEN v_cursor FOR v_sql;
    END proc_pageFull;
    END pack_page;
      

  3.   


    不,懂;帮,顶;学,习;赚,分。
    虽然这么回贴可能会被删除。
    谁他妈的删除了就是个王八蛋。
    强烈抗议CSDN这种即当婊子又想立贞洁牌坊的恶劣行为!!!
    有本事,就封杀我!!!理由在这里:
    他妈的一帮管理员有神经病啊???
    http://topic.csdn.net/u/20110422/10/1a381057-7a7b-41d9-8969-ad1f5b77f24a.html?38665
    最好给出完整的表结构,测试数据,计算方法和正确结果.否则耽搁的是你宝贵的时间。
    如果有多表,表之间如何关联?
    如何更有效地在SQL Server论坛上提问
    http://topic.csdn.net/u/20100716/19/6f132f16-20e4-418c-8dee-b99d5f86d320.html?75910
    [code=SQL]
      

  4.   

    --oracle中实现的分页存储过程。create or replace package pack_page is
    /*
    *作者:paddy
    *功能:Oracle分页
    */
      type page_cursor is ref cursor ; --定义REF游标  procedure proc_page(         --分页过程
           p_tableName    in  varchar2,--表名
           p_strWhere     in  varchar2,--查询条件
           p_orderColumn  in  varchar2,--排序字段
           p_orderStyle   in  varchar2,--排序方式(asc/desc)
          p_curPage  in out  number,--当前页码
           p_pageSize in out  number,--每页记录数
           p_totalCounts out  number,--总记录数
           p_totalPages  out  number,--总页数
           p_cursor      out  page_cursor--返回的结果集
      );end pack_page;
    /create or replace package body pack_page
    is
      procedure proc_page(
           p_tableName    in  varchar2,--表名
            p_strWhere     in  varchar2,--查询条件
            p_orderColumn  in  varchar2,--排序字段
            p_orderStyle   in  varchar2,--排序方式(asc/desc)
           p_curPage  in out  number,--当前页码
            p_pageSize in out  number,--每页记录数
            p_totalCounts out  number,--总记录数
            p_totalPages  out  number,--总页数
            p_cursor      out  page_cursor--返回的结果集
      )
      /*
      *作者:paddy
      *功能:Oracle分页存储过程
      */
      is
        v_startCurs   number;--游标开始
         v_endCurs     number;--游标结束
         v_sql         varchar2(2000);--保存查询SQL语句的变量
      begin
          v_sql:='select count(*) from '|| p_tableName;--||'where 1=1';      if p_strWhere is not null or p_strWhere <>'' then
              v_sql:=v_sql||' where '||p_strWhere;
          end if;
          execute immediate v_sql into p_totalCounts;--查询总记录数       p_totalPages:=ceil(p_totalCounts/p_pageSize);--计算总页数       if p_pageSize<0 then
              Raise_Application_Error(-20012,'pageSize can not <0 !');
          end if;      if p_curPage<=0 then --判断当前页是否小于等于0
              p_curPage:=1;
          end if;      if p_curPage>p_totalPages then --判断当前页是否超过最大页
              p_curPage:=p_totalPages;
          end if;      v_startCurs := (p_curPage-1)*p_pageSize+1;--计算游标的开始位置
           v_endCurs   := p_curPage*p_pageSize;--计算游标的结尾位置       v_sql:='select * from (select rownum num,t.* from (select * from '||p_tableName;--查询SQL语句的开始部分       if p_strWhere is not null or p_strWhere<>'' then  --判断是否有查询的条件传进来,有则加上
              v_sql:=v_sql||' where '||p_strWhere;
          end if;      if p_orderColumn is not null or p_orderColumn<>'' then   --判断是否有排序条件传进来,有则加上
              v_sql:=v_sql||' order by '||p_orderColumn||' '||p_orderStyle;
          end if;      v_sql:=v_sql||') t where rownum<='||v_endCurs||')where num>='||v_startCurs;--查询SQL语句的结尾部分      dbms_output.put_line(v_sql); --打印输出最终的查询SQL语句      open p_cursor for v_sql; --打开游标并动态执行v_sql  exception when others then
          Raise_Application_Error(-20013,'something errors we can not know in proc_page !');
      end proc_page;
    end pack_page;
    /
    --test:
    declare
           v_tableName   varchar2(100) :='emp' ; --表名
            v_strWhere    varchar2(100) :='1=1';--查询条件
            v_orderColumn varchar2(100) :='sal';--排序字段
            v_orderStyle  varchar2(100) :='desc';--排序方式(asc/desc)
           v_curPage     number := -1 ;--当前页码
            v_pageSize    number := 3  ;--每页记录数
            v_totalCounts number ;--总记录数
            v_totalPages  number ;--总页数
            v_cursor      pack_page.page_cursor;--返回的结果集
    begin
         pack_page.proc_page(
                       v_tableName,
                       v_strWhere,
                       v_orderColumn,
                       v_orderStyle,
                       v_curPage,
                       v_pageSize,
                       v_totalCounts,
                       v_totalPages,
                       v_cursor) ;
         Dbms_Output.put_line('curPage='||v_curPage);
         Dbms_Output.put_line('pageSize='||v_pageSize);
         Dbms_Output.put_line('totalCounts='||v_totalCounts);
         Dbms_Output.put_line('totalPages='||v_totalPages);
    end;--result:
    85  PL/SQL block, executed in 0.015 sec.
        select * from (select rownum num,t.* from (select * from emp where 1=1 order by sal desc) t where rownum<=3)where num>=1
        curPage=1
        pageSize=3
        totalCounts=16
        totalPages=6
        Total execution time 0.015 sec.
      

  5.   

    把拼出的sql打印出来看看,就知道语句哪错了