我想在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;
/
下面是我已经写好了的代码:
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;
/
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;
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
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;