oracle 分页 很棒的sql语句
程序员文章站
2023-12-06 13:03:04
create or replace procedure proc6338196642095312503719(输入新闻主题 varchar2,输入新闻内容 varchar2...
create or replace procedure proc6338196642095312503719(输入新闻主题 varchar2,输入新闻内容 varchar2,输入发布时间 varchar2,输入当前页码 number,输入每页行数 number,输出当前页码 out number,输出总行行数 out number,输出总页页数 out number,输入是否下页 number,输入新闻编号 varchar2,return_cursor out customtype.myrctype)
--功能描述:
--编写人:
--编写日期:
--如果返回结果集,必须使用自定义游标return_cursor
is --or as
--变量定义区
v_cpagecount integer; -- 要显示的数据总行数
v_cpage integer; -- 要显示数据的当前页
begin
--存储过程主体
if 输入新闻编号 is null then
begin
--- 输出总行行数
select max(rownum) into 输出总行行数 from(
select * from xtnews where 1=1
and 输入新闻主题 is null or (输入新闻主题 is not null and v_xwzt like '%'||输入新闻主题||'%')
and 输入发布时间 is null or (输入发布时间 is not null and d_fbsj = to_date(输入发布时间,'yyyy-mm-dd'))
)where 输入新闻内容 is null or (输入新闻内容 is not null and v_xwnr like '%'||输入新闻内容||'%');
-- 输出总页页数
select ceil(输出总行行数/输入每页行数) into 输出总页页数 from dual;
exception when no_data_found then
null;
end;
-- 计算 输入当前页码 要显示的数据总行数
if 输入当前页码 is not null then
-- xia一页
if 输入是否下页 = 1 then
-- 计算 获取数据的当前页
v_cpage := (输入当前页码 + 1);
-- 最后一页
if v_cpage > 输出总页页数 then
v_cpage := 输出总页页数;
end if;
end if;
-- shang一页
if 输入是否下页 = 0 then
-- 计算 获取数据的当前页
v_cpage := (输入当前页码 - 1);
-- 最前一页
if v_cpage = 0 then
v_cpage := 1;
end if;
end if;
-- 要显示的数据总行数
v_cpagecount := v_cpage * 输入每页行数;
end if;
end if;
-- 执行查询 获取 要显示的数据
begin
open return_cursor for
select nts.* from(
select nt.* from (
select rownum 序号,n.* from(
select * from(
select * from(
select
i_id 新闻编号,
v_xwzt 新闻主题,
v_xwnr 新闻内容,
d_fbsj 发布时间,
d_yxsj 有效时间,
v_fbbm 发布部门
from xtnews
where 1=1 and 输入新闻主题 is null or (输入新闻主题 is not null and v_xwzt like '%'||输入新闻主题||'%')
)where 输入新闻内容 is null or (输入新闻内容 is not null and 新闻内容 like '%'||输入新闻内容||'%')
)where 输入发布时间 is null or (输入发布时间 is not null and 发布时间 = to_date(输入发布时间,'yyyy-mm-dd'))
)n where 输入新闻编号 is null or (输入新闻编号 is not null and 新闻编号 = 输入新闻编号)
order by rownum
)nt where nt.序号 <= v_cpagecount order by 序号 desc
)nts where nts.序号 > (v_cpagecount-输入每页行数) order by 序号;
exception when no_data_found then
null;
end;
-- 输出最后计算的当前页码
if 输入新闻编号 is null and v_cpage is not null then
输出当前页码 := v_cpage;
end if;
end;
--功能描述:
--编写人:
--编写日期:
--如果返回结果集,必须使用自定义游标return_cursor
is --or as
--变量定义区
v_cpagecount integer; -- 要显示的数据总行数
v_cpage integer; -- 要显示数据的当前页
begin
--存储过程主体
if 输入新闻编号 is null then
begin
--- 输出总行行数
select max(rownum) into 输出总行行数 from(
select * from xtnews where 1=1
and 输入新闻主题 is null or (输入新闻主题 is not null and v_xwzt like '%'||输入新闻主题||'%')
and 输入发布时间 is null or (输入发布时间 is not null and d_fbsj = to_date(输入发布时间,'yyyy-mm-dd'))
)where 输入新闻内容 is null or (输入新闻内容 is not null and v_xwnr like '%'||输入新闻内容||'%');
-- 输出总页页数
select ceil(输出总行行数/输入每页行数) into 输出总页页数 from dual;
exception when no_data_found then
null;
end;
-- 计算 输入当前页码 要显示的数据总行数
if 输入当前页码 is not null then
-- xia一页
if 输入是否下页 = 1 then
-- 计算 获取数据的当前页
v_cpage := (输入当前页码 + 1);
-- 最后一页
if v_cpage > 输出总页页数 then
v_cpage := 输出总页页数;
end if;
end if;
-- shang一页
if 输入是否下页 = 0 then
-- 计算 获取数据的当前页
v_cpage := (输入当前页码 - 1);
-- 最前一页
if v_cpage = 0 then
v_cpage := 1;
end if;
end if;
-- 要显示的数据总行数
v_cpagecount := v_cpage * 输入每页行数;
end if;
end if;
-- 执行查询 获取 要显示的数据
begin
open return_cursor for
select nts.* from(
select nt.* from (
select rownum 序号,n.* from(
select * from(
select * from(
select
i_id 新闻编号,
v_xwzt 新闻主题,
v_xwnr 新闻内容,
d_fbsj 发布时间,
d_yxsj 有效时间,
v_fbbm 发布部门
from xtnews
where 1=1 and 输入新闻主题 is null or (输入新闻主题 is not null and v_xwzt like '%'||输入新闻主题||'%')
)where 输入新闻内容 is null or (输入新闻内容 is not null and 新闻内容 like '%'||输入新闻内容||'%')
)where 输入发布时间 is null or (输入发布时间 is not null and 发布时间 = to_date(输入发布时间,'yyyy-mm-dd'))
)n where 输入新闻编号 is null or (输入新闻编号 is not null and 新闻编号 = 输入新闻编号)
order by rownum
)nt where nt.序号 <= v_cpagecount order by 序号 desc
)nts where nts.序号 > (v_cpagecount-输入每页行数) order by 序号;
exception when no_data_found then
null;
end;
-- 输出最后计算的当前页码
if 输入新闻编号 is null and v_cpage is not null then
输出当前页码 := v_cpage;
end if;
end;