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

游标分页存储过程

发布时间: 2023-02-25 23:53:35

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

调用的时候这样
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 ;
/

③ 高效分页存储过程,对比一下谢谢

我在给你一个回答!
我一般都不会用你的那2种方法!
总之原因很多啦!
我是一典型的数据中心论者!
我用的就是这种方法!
本人感觉非常好!
推荐你也试试看!

在数据库中写语句!
create database mydb
go
use mydb
go
create table news
(id varchar(50) primary key,
name varchar(50)
)
go
insert into news values('020','sss')
insert into news values('021','ttt')
insert into news values('022','uuu')
insert into news values('001','aaa')
insert into news values('002','bbb')
insert into news values('003','ccc')
insert into news values('004','aaa')
insert into news values('005','ddd')
insert into news values('006','eee')
insert into news values('007','fff')
insert into news values('008','ggg')
insert into news values('009','hhh')
insert into news values('010','iii')
insert into news values('011','jjj')
insert into news values('012','kkk')
insert into news values('013','lll')
insert into news values('014','mmm')
insert into news values('015','nnn')
insert into news values('016','ooo')
insert into news values('017','ppp')
insert into news values('018','qqq')
insert into news values('019','rrr')
go
select * from news
go

create proc proc_cursor --定义存储过程
@pagesize int, --每页有多少条数据
@pageindex int, --第几页
@pagetotal int output --总页数
as
begin
declare @total int,@start int,@end int,@id varchar(10),@name varchar(10),@i int
--定义几个变量,作用后面解释

declare mycur scroll cursor
for
select * from news order by ID
--定义一个滚动游标

open mycur
--打开游标

set @total = @@cursor_rows
--得到总的记录数

if @total> 0
begin
if @total % @pagesize = 0
set @pagetotal = @total / @pagesize
else
set @pagetotal = @total / @pagesize + 1
--得到总页数

if @pageindex < 1 set @pageindex = 1
if @pageindex > @pagetotal
set @pageindex = @pagetotal
--检查输入页数,确保它在1到总页数之间

set @start = (@pageindex-1)*@pagesize+1
--游标第一次移动到的位置,比如我们需要第11到15条记录,那么这个参数的值是11
set @end= @pageindex*@pagesize
--游标第二次移动到的位置,如上,这个值应该是15
if @end > @total
set @end = @total
--确保第二次移动不超过记录的总条数

set @i=@start
while(@i<=@end)
begin
fetch absolute @i from mycur into @id,@name
print @id+' '+@name
set @i=@i+1
end
end
else
begin
set @pagetotal = 0
select top 0 * from news
end
close mycur
--关闭游标
deallocate mycur
--释放游标
end
go

declare @pagetotal int
exec proc_cursor 5,7, @pagetotal output
--执行存储过程
print ' '
print '共'+convert(varchar(10),@pagetotal)+'页'
go

drop proc proc_cursor
--删除存储过程
use master
go
drop database mydb
--删除数据库
go
然后你在直接调用就OK啦么!

④ 求一个通用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;

⑤ 存储过程为什么要用游标,什么情况下使用游标

游标一般用于把通过脚本得到的结果集的内容在用于其它的SQL语句中。但是游标执行会影响脚本执行速度,所以使用时请慎重。 在存储过程或触发器中使用 SQL 游标的典型过程为: 声明SQL 变量包含游标返回的数据。为每个结果集列声明一个变量。声明足够大的变量来保存列返回的值,并声明变量的类型为可从列数据类型隐式转换得到的数据类型。

使用 DECLARE CURSOR 语句将 SQL 游标与 SELECT 语句相关联。另外,DECLARE CURSOR 语句还定义游标的特性,例如游标名称以及游标是只读还是只进。

使用 OPEN 语句执行 SELECT 语句并填充游标。

使用 FETCH INTO 语句提取单个行,并将每列中的数据移至指定的变量中。然后,其他 SQL 语句可以引用那些变量来访问提取的数据值。SQL 游标不支持提取行块。

使用 CLOSE 语句结束游标的使用。关闭游标可以释放某些资源,例如游标结果集及其对当前行的锁定,但如果重新发出一个 OPEN 语句,则该游标结构仍可用于处理。由于游标仍然存在,此时还不能重新使用该游标的名称。DEALLOCATE 语句则完全释放分配给游标的资源,包括游标名称。释放游标后,必须使用 DECLARE 语句来重新生成游标。

请采纳。

热点内容
ftp服务器攻击 发布:2025-07-10 10:28:46 浏览:140
提高studio编译速度 发布:2025-07-10 10:28:46 浏览:415
Char在sql 发布:2025-07-10 10:19:19 浏览:783
请密码不叫什么说话 发布:2025-07-10 10:06:22 浏览:115
苹果应用怎么设置密码 发布:2025-07-10 10:04:00 浏览:838
雪国脚本 发布:2025-07-10 10:04:00 浏览:939
编程让 发布:2025-07-10 09:48:13 浏览:359
数据库逻辑存储结构 发布:2025-07-10 09:26:56 浏览:920
密码编译找规律 发布:2025-07-10 09:18:10 浏览:512
电影视频缓存后 发布:2025-07-10 09:16:48 浏览:894