我想在Oracle中分页,设想把他做成一个通用的过程,已经把查询语句编写完成了,但是不知道该怎样的把查询出来的内容通过包含有html代码的形式返回到前台,请哪位帮忙看下了。
      下面是我已经写好了的代码:
SET serveroutput ON
--分页显示程序
--参数说明
--Table_name,表明
--Tfield,字段
--Twhere,查询的条件
--Torder,排序字段
--Tgroup,分组字段
--Tpagesize,每页显示的记录数
--Tpagenonce,当前的页数
--Ipage,连接的页面
--errCode,返回错误编号
--errStr,返回错误原因
--strReturn,返回的字符串,为out参数
--注意:在传参数的时候,Tpagesize,Tpagenonce两个参数必须同时的输入,而且不管是否要分页都
--需要传参数进来,默认的两个参数都为-156,说明不需要分页。CREATE OR REPLACE PROCEDURE pagination

    Table_name IN VARCHAR2,Tfield IN VARCHAR2,
    Twhere IN VARCHAR2,Torder IN VARCHAR2,
    Tgroup IN VARCHAR2,Tpagesize IN NUMBER,
    Tpagenonce IN VARCHAR2,Ipage IN VARCHAR2,
    errCode OUT number,errStr OUT VARCHAR2,
    strReturn OUT VARCHAR2
)
AS
--声明本地变量
     strSql VARCHAR2(2000);
     --用于保存查询总共有多少条记录数的sql语句
     strSql_two VARCHAR2(2000);
     --用于保存有多少的记录数
     sqlcount NUMBER(5);
     Table_name_local VARCHAR2(500);
     Tfield_local VARCHAR2(500);
     --为了在分页中用
     Tfield_two_local VARCHAR2(500);
     Twhere_local VARCHAR2(500);
     --保存总共有多少的记录数
     Tpagesize_local NUMBER(10);
     Torder_local VARCHAR2(500);
     Tgroup_local VARCHAR2(500);
     Tpagenonce_local NUMBER(5);
     --Ipage_local VARCHAR2(500);
     s VARCHAR2(500);
     j NUMBER(2);
     page NUMBER(5);
BEGIN
    --判断表明是否为空
    IF Table_name<>' ' THEN
       Table_name_local:=Table_name;
    ELSE
       Table_name_local:= 'emp';
    END IF;
    
    --判断字段是否为空
    IF Tfield<>' ' THEN
       Tfield_local:=Tfield;
    ELSE
       --为了在分页中好处理*
       --用于分页中的外查询中
       Tfield_two_local:='*';
       --用于分页查询中的内查询中
       Tfield_local:=Table_name||'.*';
    END IF;
    
    --判断条件是否为空
    IF  Twhere<>' ' THEN                    --用于在分页的时候用
        strSql:='select '|| Tfield_local ||',rownum as numpage ' || ' from '||Table_name_local ||' where ' || Twhere;
        --用于统计有多少的记录数
        strSql_two:='select count(*) into i from '|| Table_name_local ||' where ' || Twhere;
    ELSE
        strSql:='select '|| Tfield_local ||',rownum as numpage ' || ' from '|| Table_name_local;
        --用于统计有多少的记录数
        strSql_two:='select count(*) into  i  from '|| Table_name_local;
    END IF;
   
    --判断分组
    IF Tgroup <>' ' THEN
       strSql:=strSql||' group by '|| Tgroup;
    END IF;
    
    --判断排序
    IF Torder <>' ' THEN
       strSql:=strSql||' order by '|| Torder;
    END IF;
    --合并sql语句
    --要根据传进来的字段来组合sql语句
    --如果传进来的为空侧:
    --先判断是否要分页
    --说明不需要分页,此时的处理代码如下:
    --为了取到所有的记录数,先执行一下查询,看有多少的记录数,但是这样的性能会受到影响
    strSql_two:='declare i number; begin '|| strSql_two ||'; dbms_output.put_line(i); end;';
    EXECUTE IMMEDIATE strSql_two;
    --从内存中取出统计的记录数
    dbms_output.get_line(s,j);
    Tpagesize_local:=s;
    dbms_output.put_line(s);
    --判断分页
    IF Tpagesize='-156' AND Tpagenonce='-156' THEN
        IF Tfield <>' ' THEN
            strSql:='select '|| Tfield_local ||' from ( '||strSql||' ) where numpage '||'>2';
        ELSE
            strSql:='select '|| Tfield_two_local ||' from ( '||strSql||' ) where numpage '||'>1';
        END IF;
    ELSE
        --需要分页时的处理
        --处理显示的页数和要显示的当前页
        --判断当前页
        IF to_number(Tpagenonce)<1 THEN
           Tpagenonce_local:=1;
        ELSE
           Tpagenonce_local:=Tpagenonce;
        END IF;
        
        IF to_number(Tpagenonce)>to_number(Tpagesize_local/Tpagesize) THEN
           Tpagenonce_local:=to_number(Tpagesize_local/Tpagesize);
        ELSE
           Tpagenonce_local:=Tpagenonce;
        END IF;
        --去总共有多少页
        
        dbms_output.put_line(Tpagenonce_local);
        dbms_output.put_line(Tpagesize);
        
        --写SQl语句
        page:=to_number(to_number(Tpagenonce_local)/to_number(Tpagesize));
        dbms_output.put_line(page);
        IF Tfield <>' ' THEN
           strSql:='select '|| Tfield_local ||' from ( '||strSql||' ) where numpage '||'>'|| (Tpagenonce_local-1)*Tpagesize  ||' and numpage < ' ||((Tpagenonce_local-1)*Tpagesize+Tpagesize+1);
        ELSE
           strSql:='select '|| Tfield_two_local ||' from ( '||strSql||' ) where numpage '||'>'|| (Tpagenonce_local-1)*Tpagesize ||' and numpage < '||((Tpagenonce_local-1)*Tpagesize+Tpagesize+1);
        END IF;
    END IF;
   
    --执行语句
    dbms_output.put_line(strSql);
    EXECUTE IMMEDIATE strSql;
    errCode:=1;
    errStr:='执行成功!';
    
EXCEPTION
     WHEN OTHERS THEN
        errCode:=SQLCODE;
        errStr:=SQLERRM;
END;
/

解决方案 »

  1.   

    把你的代码写到包里,返回结果集。copy前辈的例子,你看看吧。
    create or replace package pkg_test
    as
      type myCursor is ref cursor;
      function get(p_id number) return myCursor;
    end pkg_test;create or replace package body pkg_test 
    as
      --输入ID 返回记录集的函数
      function get(p_id number) return myCursor is
         rc myCursor;
         strsql varchar2(200);
      begin
         if p_id=0 then 
            open rc for select a.user_name from fnd_user a ;  
         else
            strsql:='select a.user_name from fnd_user a where a.user_id=:p_id';
            open rc for strsql using p_id;
         end if;
         return rc;  
         end get;
    end pkg_test;
    --上面是一个返回结果集的函数,下面调用.
    create or replace procedure pro_test as
        v_out pkg_test%myCursor;
        v_name varchar2(100);
    begin
        v_out:=pkg_test.get(0);  --得到结果集
        loop
            fetch v_out into v_name;
            exit when v_out%notfound;
            --这里进行处理,想要处理哪一行或进行什么处理在这里进行
        end loop;
    ......
    end;
      

  2.   

    PROCEDURE DotNetPagination(
      Pindex in decimal,--第几页
      Psql in varchar2, --表名称
      Psize in decimal,  --分页大小
      Pcount out decimal,--总页数
      v_cur out type_cur
     )
     AS  v_sql VARCHAR2(1000);
      v_count decimal;  
      v_Plow decimal;
      v_Phei decimal;
     Begin
      ------------------------------------------------------------取分页总数
      v_sql := 'select count(*) from (' || Psql || ')';
      execute immediate v_sql into v_count;
      Pcount := ceil(v_count/Psize);
      ------------------------------------------------------------显示任意页内容
      v_Phei := Pindex * Psize + Psize;
      v_Plow := v_Phei - Psize + 1;
      --Psql := 'select rownum rn,t.* from cd_ssxl t' ;            --要求必须包含rownum字段
      v_sql := 'select * from (' || Psql || ') where rn between ' || v_Plow || ' and ' || v_Phei ;  open v_cur for v_sql;
      
     End DotNetPagination;
     
     --**************************************************************************************
     
     procedure DotNetPageRecordsCount(
      Psqlcount in varchar2,
      Prcount   out decimal
      )
      as
      
       v_sql varchar2(1000);
       v_prcount decimal;
       
      begin
      
       v_sql := 'select count(*) from (' || Psqlcount || ')';
       execute immediate v_sql into v_prcount;
       Prcount := v_prcount;                  --返回记录总数                                                      
       
      end DotNetPageRecordsCount;
      
     --**************************************************************************************
      
     --分页测试
    PROCEDURE DotNetPagination1(
      Pindex in number,
      Psql in varchar2, 
      Psize in number,  
      Pcount out number,
      v_cur out type_cur
     )
     AS  v_sql VARCHAR2(1000);
      v_count number;  
      v_Plow number;
      v_Phei number;
     Begin
      ------------------------------------------------------------取分页总数
      v_sql := 'select count(*) from (' || Psql || ')';
      execute immediate v_sql into v_count;
      Pcount := ceil(v_count/Psize);
      ------------------------------------------------------------显示任意页内容
      v_Phei := Pindex * Psize + Psize;
      v_Plow := v_Phei - Psize + 1;
      --Psql := 'select rownum rn,t.* from cd_ssxl t' ;            --要求必须包含rownum字段
      v_sql := 'select * from (' || Psql || ') where rn between ' || v_Plow || ' and ' || v_Phei ;  open v_cur for v_sql;
      
     End DotNetPagination1;
     
     --**************************************************************************************
     
     procedure DotNetPageRecordsCount1(
      Psqlcount in varchar2,
      Prcount   out number
      )
      as
      
       v_sql varchar2(1000);
       v_prcount decimal;
       
      begin
      
       v_sql := 'select count(*) from (' || Psqlcount || ')';
       execute immediate v_sql into v_prcount;
       Prcount := v_prcount;                  --返回记录总数                                                      
       
      end DotNetPageRecordsCount1;
    &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
       select * from (select tt1.*,rownum rowno from
       (select * from zd_xzqh) tt1) where rowno between 4 and 5
      

  3.   

    create or replace procedure search(p_mininteger,p_maxinteger,p_rowset out
    sys_refcursor)
    is
    begin
       select cursor(*) into p_rowset
          from (select rownumr,all_objects.* from all_objects where rownum <=
     p_max) t
        where t.r >= p_min;
    end search;