你这不是已经写好了嘛。
创新互联建站咨询热线:13518219792,为您提供成都网站建设网页设计及定制高端网站建设服务,创新互联建站网页制作领域10余年,包括办公空间设计等多个领域拥有丰富的网站运维经验,选择创新互联建站,为企业保驾护航!
外层调用程序只要声明变量mycursor并且作为参数传到emp_pro存储过程中,执行结束后就可以使用了。
Oracle中函数/过程返回结果集的几种方式
原文 Oracle中函数/过程返回结果集的几种方式
Oracle中函数/过程返回结果集的几种方式:
以函数return为例,存储过程只需改为out参数即可,在oracle 10g测试通过.
(1) 返回游标:
return的类型为:SYS_REFCURSOR
之后在IS里面定义变量:curr SYS_REFCURSOR;
最后在函数体中写:
open cur for
select ......;
return cur;
我试着去弄了一下,只能返回游标啊
select xx from dual好像本身只能返回一行数据,无法返回多行数据
以下是我做一个返回游标的函数。
create or replace package types as
type mytype is ref cursor;
end;
create or replace function oraclefunc(col_in varchar)
return types.mytype is
mycursor types.mytype;
restr varchar2(4096);
begin
restr:=trim(col_in);
restr:=replace(restr,',',''' as 列名 from dual union select ''');
restr:=''''||restr||'''';
restr:='select '||restr;
restr:=restr||' as 列名 from dual';
open mycursor for restr;
return mycursor;
end;
你这个结构有问题,你这个循环不管几次,总是会在第一次就跳出去。return 应该是在loop结束之后。
去看看上面的查询能不能返回结果。
自己写的程序尽量有异常控制。方便调试。你这种简单的程序,调试一下就能看到问题在哪里了。
返回cursor的话,那么必须要cursor的手段来处理,不能作为查询语句的目的表。
如果需要在函数返回一个可以供查询语句使用的结果集,那么该函数的返回类型应该定义为一个索引表类型(一个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;
oracle
跟ms不一样。
要返回表的记录数据,只能通过游标,或者自定义对象数组在存储过程中组装好后返回。