当前位置:首页 » 存储配置 » oracle存储过程分页

oracle存储过程分页

发布时间: 2022-09-17 22:44:11

Ⅰ Oracle 数据量非常大(上亿)时,使用存储过程中的游标返回分页查询的10条记录非常耗时,请问如何优化

select * /*+ FIRST_ROWS */from XXX where XXX
提高sql语句的响应时间,快速的先返回 n 行。
SELECT /*+ FIRST_ROWS */ * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
WHERE ROWNUM <= 40
)
WHERE RN >= 21

Ⅱ 求一个通用ORACLE存储过程,实现分页和查询

create
or
replace
package
Tools
is
type
ResultData
is
ref
cursor;
procere
sp_Page(p_PageSize
int,
--每页记录数
p_PageNo
int,
--当前页码,从
1
开始
p_SqlSelect
varchar2,
--查询语句,含排序部分
p_SqlCount
varchar2,
--获取记录总数的查询语句
p_OutRecordCount
out
int,--返回总记录数
p_OutCursor
out
ResultData);
end
Tools;
create
or
replace
package
body
Tools
is
procere
sp_Page(p_PageSize
int,
--每页记录数
p_PageNo
int,
--当前页码,从
1
开始
p_SqlSelect
varchar2,
--查询语句,含排序部分
p_SqlCount
varchar2,
--获取记录总数的查询语句
p_OutRecordCount
out
int,--返回总记录数
p_OutCursor
out
ResultData)
as
v_sql
varchar2(3000);
v_count
int;
v_heiRownum
int;
v_lowRownum
int;
begin
----取记录总数
execute
immediate
p_SqlCount
into
v_count;
p_OutRecordCount
:=
v_count;
----执行分页查询
v_heiRownum
:=
p_PageNo
*
p_PageSize;
v_lowRownum
:=
v_heiRownum
-
p_PageSize
+1;
v_sql
:=
'SELECT
*
FROM
(
SELECT
A.*,
rownum
rn
FROM
('||
p_SqlSelect
||')
A
WHERE
rownum
<=
'||
to_char(v_heiRownum)
||
'
)
B
WHERE
rn
>=
'
||
to_char(v_lowRownum)
;
--注意对rownum别名的使用,第一次直接用rownum,第二次一定要用别名rn
OPEN
p_OutCursor
FOR
v_sql;
end
sp_Page;
end
Tools;

Ⅲ oracle用游标分页查询学生所有信息

Oracle内分页:
1.首先创建返回结果集的包,代码如下:
--创建包
create or replace package types as
type cursorType is ref cursor;
end;12341234

2.创建实现分页查询的存储过程:
--创建存储过程
CREATE OR REPLACE PROCEDURE PROC_GET_DATA_PAGING(P_TABLENAME IN VARCHAR2, --表(视图)名
P_STRWHERE IN VARCHAR2, --查询条件
P_ORDERCOLUMN IN VARCHAR2, --排序的列
P_CURPAGE IN OUT NUMBER, --当前页
P_PAGESIZE IN OUT NUMBER, --每页显示记录条数
P_TOTALRECORDS OUT NUMBER, --总记录数
P_TOTALPAGES OUT NUMBER, --总页数
V_CUR OUT TYPES.CURSORTYPE) --返回的结果集
IS
V_SQL VARCHAR2(4000) := ''; --SQL语句
V_STARTRECORD NUMBER(10); --开始显示的记录条数
V_ENDRECORD NUMBER(10); --结束显示的记录条数
V_SHOWALL INTEGER; --是否显示全部记录
BEGIN
--记录中总记录条数
V_SQL := 'SELECT TO_NUMBER(COUNT(*)) FROM ' || P_TABLENAME ||
' WHERE 1=1 ';
IF P_STRWHERE IS NOT NULL OR P_STRWHERE <> '' THEN
V_SQL := V_SQL || P_STRWHERE;
END IF;
EXECUTE IMMEDIATE V_SQL
INTO P_TOTALRECORDS;

--验证页面记录大小
IF P_PAGESIZE <= 0 THEN
V_SHOWALL := 1;
P_PAGESIZE := 0;
END IF;

IF V_SHOWALL IS NULL THEN
--根据页大小计算总页数
IF MOD(P_TOTALRECORDS, P_PAGESIZE) = 0 THEN
P_TOTALPAGES := TRUNC(P_TOTALRECORDS / P_PAGESIZE, 0);
ELSE
P_TOTALPAGES := TRUNC(P_TOTALRECORDS / P_PAGESIZE, 0) + 1;
END IF;

ELSE
P_TOTALPAGES := 1;

END IF;

--验证页号
IF P_CURPAGE < 1 THEN
P_CURPAGE := 1;
END IF;
IF P_CURPAGE > P_TOTALPAGES THEN
P_CURPAGE := P_TOTALPAGES;
END IF;

--实现分页查询
V_STARTRECORD := (P_CURPAGE - 1) * P_PAGESIZE + 1;
V_ENDRECORD := P_CURPAGE * P_PAGESIZE;
V_SQL := 'SELECT * FROM (SELECT A.*, ROWNUM R FROM ' ||
'(SELECT * FROM ' || P_TABLENAME;
IF P_STRWHERE IS NOT NULL OR P_STRWHERE <> '' THEN
V_SQL := V_SQL || ' WHERE 1=1 ' || P_STRWHERE;
END IF;
IF P_ORDERCOLUMN IS NOT NULL OR P_ORDERCOLUMN <> '' THEN
V_SQL := V_SQL || ' ORDER BY ' || P_ORDERCOLUMN;
END IF;
IF V_SHOWALL IS NULL THEN
V_SQL := V_SQL || ') A WHERE ROWNUM <= ' || V_ENDRECORD ||
') B WHERE R >= ' || V_STARTRECORD;
ELSE
V_SQL := V_SQL || ') A ) B ';
END IF;

DBMS_OUTPUT.PUT_LINE(V_SQL);
OPEN V_CUR FOR V_SQL;
END PROC_GET_DATA_PAGING;0414204142

一定要先创建返回结果集的包,否则编译存储过程有问题。

Ⅳ asp连接oracle数据库分页问题

利用存储过程分页会好一些。
或者换一下分页的SQL语句,尽量不使用ADO的相关属性。
参考如下:
方案1
显示从第n条到第m条记录
select top m-n+1 * from table where id not in (select top n-1 from table order by id) order by id

思想:显示从第n条到第m条记录等价于 先筛选ID不等于前n-1条记录ID的记录,在从这些记录中按ID排序,取m-n+1条记录。

SQLserver实现:
显示从第n条到第m条记录===每页容量(页大小)
前n-1条记录====页容量*(页码-1)
select top 页容量 * from table where id not in (select top 页容量*(页码-1) from table order by id) order by id
当第1页时
select top 页容量 * from table
******************************************************************************************************************

方案2
显示从第n条到第m条记录
select top m-n+1 * from table where id >(select max(id) from (select top n-1 from table order by id) as t1) order by id

思想:先从前n-1条记录中计算ID最大值,则所要显示的记录是满足ID大于最大值的前m-n+1条记录。
当n=1时,直接 select top m-1 * from table

SQLserver实现:
select top 页容量 * from table where id >(select max(id) from (select top 页容量*(页码-1)from table order by id) as t1) order by id
当第1页时
select top 页容量 * from table

方案3
显示从第n条到第m条记录

select * from (select top m-n+1 * from (select top m * from order by id asc) as t1 order by id desc) as t2 order by id asc

思想:先按ID升序(降序)取前m条记录,再按ID降序(升序)取前m-n+1条记录,最后从前m-n-1条记录中取显示的记录

SQLserver实现:
select * from (select top 页容量 * from (select top 页容量*页码 * from order by id asc) as t1 order by id desc) as t2 order by id asc

Ⅳ oracle:写一个用于分页的存储过程.调用的时候可以传参

select
*
from
(select
a.*,rownum
r
from
(select
*
from
table_a)
a
where
rownum<=b)
where
r>=a
该sql语句实现了分页查询。
其中table_a表示你要查询的那张表,r>=a,rownum<=b中的a和b表示需要查询的记录的起止数。
需要做分页的话,上面的b可以改成currentPage*pageCount,a可以改成(currentPage-1)*pageCount,
currentPage表示当前页数,pageCount表示总页数

Ⅵ oracle做分页查询怎么做

sql语句如下:

  • 分页1

  1. SELECT *

  2. FROM (Select ROWNUM AS ROWNO, T.*

  3. from 表名 T(别名)

  4. where 表字段 between to_date('20060501', 'yyyymmdd') and to_date('20060731', 'yyyymmdd')

  5. AND ROWNUM <= 20) TABLE_ALIAS

  6. WHERE TABLE_ALIAS.ROWNO >= 10;

  7. 经过测试,此方法成本最低,只嵌套一层,速度最快,即使查询的数据量再大,也几乎不受影响,速度依然.


  • 分页2:

  1. SELECT *

  2. FROM (SELECT TT.*, ROWNUM AS ROWNO

  3. FROM (Select t.*

  4. from 表名 T(别名)

  5. where flight_date between to_date('20060501', 'yyyymmdd') and

  6. to_date('20060531', 'yyyymmdd')

  7. ORDER BY FACT_UP_TIME, flight_no) TT(别名二)

  8. WHERE ROWNUM <= 20) TABLE_ALIAS

  9. where TABLE_ALIAS.rowno >= 10;

    经过测试,此方法随着查询范围的扩大,速度也会越来越慢,


Ⅶ Oracle多条件查询的分页存储如何操作

项目接近尾声了源码天空,感觉将业务逻辑放到Oracle中使得后台代码很精简,Oracle很有搞头!PL\SQL:create or replace procere proc_client_List --客户Oracle多条件查询(pro_cursor out pkg_order.p_cursor, --查询结果集characters_ in varchar2,--客户性质states_ in varchar2,--客户状态type_ in varchar2,--客户类型calling_ in varchar2,--客户行业name_ in varchar2,--客户名称beginTime_ in date,--创建日期上限endTime_ in date,--创建日期上限area_ in number,--客户地区clientsource_ in varchar2,--客户来源importent_ in varchar2,--重要程度start_row in number,--结果集起始行end_row in number--结果集结束行) is sql_str varchar2(1000):= 'select * from ( select row_.*, rownum rownum_ from ( select * from clientinfo c where(:characters_ is null or c.characters like :characters_) and (:states_ is null or c.states like :states_) and (:type_ is null or c.type like :type_) and (:calling_ is null or c.calling like :calling_) and (:name_ is null or c.name like :name_) and (:beginTime_ is null or c.createtime > :beginTime_) and (:endTime_ is null or c.createtime < :endTime_) and (:area_ is null or c.area=:area_) and (:clientsource_ is null or c.clientsource like :clientsource_) and (:importent_ is null or c.importent like :importent_) ) row_ where rownum :start_row'; begin open pro_cursor for sql_str using characters_,'%'||characters_||'%', states_,'%'||states_||'%', type_,'%'||type_||'%', calling_,'%'||calling_||'%', name_,'%'||name_||'%', beginTime_,beginTime_, endTime_,endTime_, area_,area_, clientsource_,'%'||clientsource_||'%', importent_,'%'||importent_||'%', end_row,start_row; end proc_client_List; 上述的相关内容就是对Oracle多条件查询的分页存储过程的描述,希望会给你带来一些帮助在此方面。

热点内容
安卓微信拍了拍怎么改 发布:2025-01-17 05:57:31 浏览:46
BMF服务器的系统服务怎么关 发布:2025-01-17 05:50:29 浏览:876
免刷安卓系统怎么进入usb调试 发布:2025-01-17 05:48:21 浏览:837
数据库的三层架构 发布:2025-01-17 05:17:36 浏览:149
云顶之弈有人开脚本怎么举报 发布:2025-01-17 05:16:59 浏览:682
sql包含数字 发布:2025-01-17 05:11:56 浏览:292
密码忘记了怎么查看 发布:2025-01-17 05:02:30 浏览:682
脚本执行sql语句 发布:2025-01-17 04:47:51 浏览:702
结构体访问成员变量 发布:2025-01-17 04:32:09 浏览:31
热点缓存 发布:2025-01-17 04:30:07 浏览:523