重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
返回cursor的话,那么必须要cursor的手段来处理,不能作为查询语句的目的表。
创新互联建站是专业的林州网站建设公司,林州接单;提供成都网站设计、成都做网站,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行林州网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
如果需要在函数返回一个可以供查询语句使用的结果集,那么该函数的返回类型应该定义为一个索引表类型(一个table类型),然后在查询语句中使用table函数将函数返回的索引表转换成查询可以使用的目的表。示例如下:
1. 创建返回索引表所需的类型
create or replace type type_rec is object (idx integer, user_name varchar2(50));
create or replace type type_tb is table of type_rec;
2. 创建函数
create or replace function fn_return_tb
return type_tb
is
o_tb type_tb := type_tb();
i number := 0;
begin
for v_rec in (select 1 as idx, 'Andy' as user_name from dual
union select 2, 'Jack' from dual
union select 3, 'Paul' from dual) loop
o_tb.extend;
i := i + 1;
o_tb(i) := type_rec (v_rec.idx, v_rec.user_name);
end loop;
return o_tb;
end fn_return_tb;
3. 调用函数
select s.*
from table(fn_return_tb()) s;
create or replace procedure p_cnt(
p_time in varchar2,---查询的条件
p_cur out SYS_REFCURSOR)---游标返回
IS
v_sql varchar2(1000) :='';
v_date varchar2(20);
BEGIN
v_date := replace(p_time, '-', '');---时间的格式转换
v_sql := 'select * from dapartment d where d.d_time ='''|| v_date||'''';
END;
OPEN p_cur FOR v_sql;
END p_cnt;
oracle
跟ms不一样。
要返回表的记录数据,只能通过游标,或者自定义对象数组在存储过程中组装好后返回。
Oracle的存储过程和函数并不能直接返回查询结果集(并非不能,“没有做不到,只有想不到”,呵)。也就是说在Oracle存储过程或函数中直接写查询返回结果集是非法的(在SQL Server是可以的)。
与SQL Server的存储过程和函数均可以返回结果集不同的是,PL/SQL的存储过程和函数均不直接提供返回数据集的方法,但可以通过返回类型对象来实现返回数据集的效果。具体思路为:
(1)创建包头,在其中声明类型和存储过程,类型应该引用游标;
(2)创建包体,定义存储过程,执行查询,将查询得到的结果集以游标句柄的形式返回。
说明:游标分为显示游标和隐式游标,任何查询结果默认都提供隐式游标,当前方案的重点在于使用游标取得查询结果的句柄,由于游标被引用为类型,通过返回类型,即等效于(并不等同)返回数据集。
具体的案例如下:
--创建包头
create or replace package mypackage1
as
--声明类型,并引用游标
type cursorType is ref cursor;
--声明存储过程,两个输入参数,一个输出参数,输出游标类型数据
procedure prcGetGlobalAddress
(
pos1 integer, --分页查询的下限
pos2 integer, --分页查询的上限
cur in out mypackage1.cursorType --输出参数,数据类型为引用游标的类型
);
end mypackage1;
--创建包体
create or replace package body mypackage1
as
--定义存储过程
procedure prcGetGlobalAddress
(
pos1 integer,
pos2 integer,
cur in out mypackage1.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 mypackage1;
如果你只是返回几个值,请用OUT标记输出参数,查询代码为
SELECT SName INTO stuname FROM Student WHERE SID = stuid;
记得一定要用INTO关键字。
总之一句话,在Oracle中,在存储过程和函数中都不能直接返回查询结果集(哪怕只有1行1列也不行,这是绝对的),但可以通过变通方式实现。
Oracle中函数/过程返回结果集的几种方式
原文 Oracle中函数/过程返回结果集的几种方式
Oracle中函数/过程返回结果集的几种方式:
以函数return为例,存储过程只需改为out参数即可,在oracle 10g测试通过.
(1) 返回游标:
return的类型为:SYS_REFCURSOR
之后在IS里面定义变量:curr SYS_REFCURSOR;
最后在函数体中写:
open cur for
select ......;
return cur;