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

oracle存储过程的分页查询

发布时间: 2022-09-14 04:56:41

⑴ 一个oracle的分页查询存储过程,执行的时候报错,如下:

默认值不能给 '', 因为oracle中 '' is null
不赋值的话,就是 '' 了。所以这一行的,报错是说: 冒号出现没有起到应有的作用。

⑵ 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中建分页查询的存储过程

数据库中定义一个包,定义游标类型,比如可以这样:
create or replace package package_name
as
type outcur is ref cursor;
end ;
然后存储过程返回结果集:
create procere ttt( p_cur out package_name.outcur) as
begin open p_cur for
select ......;
end;

这样就可以返回结果集了.
如果数据量太大,返回全部记录再通过程序控制分页意义不大,效率同样太低,楼上的那个rownbr我没听过,只知道rownum,但这个伪列是不能满足分页要求的,如果数据量非常大,快速分页的话可以考虑用rowid这个列,
试试
select rowid from 任意表;
能看出结果了吧.剩下的自己想办法吧.

⑷ oracle union如何做分页查询

oracle中union无法做分页查询,需要用rownum来做分页。

如emp表中有如下数据:

⑸ 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存储过程的分页

调用的时候这样
declare
ocur tespackage.test_cursor;
v_count int:=0;
v_pagecount int :=0;
v_out int;
begin
fenye('table1',20,1,v_count,v_pagecount,ocur);
loop
fetch ocur into v_out ;
exit when ocur%notfound ;
dbms_output.put_line('count='||v_count);
end loop;
end ;
/

⑺ oracle分页查询,一个select语句解决,不需要子查询。

select column1, column2
from (select rownum recno, column1, column2
from table_name
order by column1)
where recno between N and N+10

不用子查询似乎不可能,上面语句可以输入参数实现分页查询,要不就食用存储过程。

⑻ 求一个通用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中使得后台代码很精简,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多条件查询的分页存储过程的描述,希望会给你带来一些帮助在此方面。

⑽ 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

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

热点内容
手机建行密码忘记了怎么办 发布:2025-01-16 15:45:38 浏览:224
易语言视频播放源码 发布:2025-01-16 15:39:35 浏览:343
肇观算法 发布:2025-01-16 15:38:39 浏览:610
管家婆找不到加密狗 发布:2025-01-16 15:10:28 浏览:308
linux的etcfstab 发布:2025-01-16 15:00:43 浏览:364
电脑无法登录内网服务器 发布:2025-01-16 15:00:28 浏览:575
编译nasm 发布:2025-01-16 14:54:43 浏览:202
编程实战宝典 发布:2025-01-16 14:53:12 浏览:248
ibm服务器怎么关闭开机初始化 发布:2025-01-16 14:50:41 浏览:66
浏览器上传不了图片 发布:2025-01-16 14:45:46 浏览:600