存储过程和函数并不能直接返回查询结果集

本文介绍如何在Oracle存储过程中实现分页查询的功能。通过创建包含游标的包头及包体,利用游标句柄返回查询结果。文章还提供了一个实际案例,演示了如何设置存储过程的输入输出参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Oracle的存储过程和函数并不能直接返回查询结果集。也就是说在Oracle存储过程或函数中直接写查询返回结果集是非法的(在SQL Server是可以的)。
与SQL Server的存储过程和函数均可以返回结果集不同的是,PL/SQL的存储过程和函数均不直接提供返回数据集的方法,但可以通过返回类型对象来实现返回数据集的效果。具体思路为:
(1)创建包头,在其中声明类型和存储过程,类型应该引用游标;
(2)创建包体,定义存储过程,执行查询,将查询得到的结果集以游标句柄的形式返回。
说明:游标分为显示游标和隐式游标,任何查询结果默认都提供隐式游标,当前方案的重点在于使用游标取得查询结果的句柄,由于游标被引用为类型,通过返回类型,即等效于(并不等同)返回数据集。

具体的案例如下:
--创建包头
create or replace package testpackage
as
--声明类型,并引用游标
type cursorType is ref cursor;
--声明存储过程,两个输入参数,一个输出参数,输出游标类型数据
procedure prcGetGlobalAddress
(
pos1 integer, --分页查询的下限
pos2 integer, --分页查询的上限
cur in out testpackage.cursorType --输出参数,数据类型为引用游标的类型
);
end mypackage1;


--创建包体
create or replace package body testpackage
as
--定义存储过程
procedure prcGetGlobalAddress
(
pos1 integer,
pos2 integer,
cur in out testpackage.cursorType
)
as
begin
--返回得到分页查询结果集的游标句柄
open cur for
select *
from ( select a.*,rownum rn
from ( select *
from tblsys_globaladdress) a
where rownum<=pos2)
where rn > =pos1;
end prcGetGlobalAddress;

end testpackage;

上面兩句話,又想起來ORACLE分頁的東東了,
SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (select count(*) over() CNT,
ta.ca,ta.cb,ta.cc,... from ta ORDER BY ta.ca
) A WHERE ROWNUM <= 10 ) WHERE RN >= 1
還有把*號換裝你想要字段名称效率还会继续提高 特别是大数据量的时候。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值