--你是想返回游标吧 create or replace procedure sp_test(o_data out sys_refcursor) as begin open o_data for select * from table; end;
可以定义 type CURSOR1 is REF CURSOR; 然后存储过程中定义一个 pd_1(pd_cursor out CURSOR1 )就可以返回一个结果集了。
不能是视图 可以返回游标create or replace PROCEDURE P_TEST(P_CURSOR out SYS_REFCURSOR ) is begin open P_CURSOR for select * from table1; end;
存储过程没有返回值,函数才有返回值,oracle里面也没有视图的数据类型。
嗯 发的有误 没说清楚 就是返回游标 游标存储的数据是来自视图,以下是我写的一个实例,提示游标无效,不解 create view aa view as select * from tb_test tb_test(ID CHAR(2),NAME VARCHAR2(10)) --创建存储过程 create or replace procedure sp_return_view (ret_cursor out sys_refcursor) is sqlstr varchar2(100); n_count number; begin select count(*) into n_count from aa; if n_count=0 then insert into aa values('30','xiaowang'); else sqlstr:='selece * from aa'; execute immediate sqlstr; open ret_cursor for sqlstr; end if; exception when others then dbms_output.put_line('发生其他错误,请核对代码是否正确!!'); end sp_return_view;调用过程declare ret_cursor_value sys_refcursor; view_info tb_test%rowtype; begin sp_return_view(ret_cursor_value); loop fetch ret_cursor_value into view_info ; dbms_output.put_line(view_info.id||','||view_info.name); exit when %notfound ; end loop;ret_cursor_value end;
-- 您 是要返回视图的名称,还是视图里面的数据?视图无非就是事先封装定义的SQL语句, -- 如果要返回视图里面的数据,就跟返回表里面的数据是一回事撒!-- 请看例子: -- 实例:Oracle存储过程返回数据集!CREATE table userinfo(id number(18,0), name varchar2(30), sex varchar2(10), age number(3,0), address varchar2(100));insert into userinfo(id,name,sex,age,address) values(1,'luoyoumou','男',33,'湖南省衡阳市'); insert into userinfo(id,name,sex,age,address) values(2,'miaoxiaoming','男',32,'江西省吉安市'); insert into userinfo(id,name,sex,age,address) values(3,'hanqiguang','男',28,'江西省赣州市');commit;create table userinfo2 as select * from userinfo where 1=2;-- i_address 是存储过程的输入参数,o_cur是存储过程的输出游标参数,用以获取返回的结果集! CREATE OR REPLACE PROCEDURE userinfo_proc(i_address VARCHAR2, o_cur OUT SYS_REFCURSOR) IS sqlstr VARCHAR2(200); -- 定义变量,用以存放SQL语句 BEGIN sqlstr := 'SELECT Id, Name, Sex, Age, Address FROM userinfo WHERE Address = :i_address'; -- 给SQL变量赋值,其中 :i_address 是绑定变量,以提高执行效率! OPEN o_cur FOR sqlstr USING i_address; -- 给游标变量赋值 END; /-- userinfo 是一个表的名字,如果要查询视图的结果,就将表的名字替换成你的视图的名字, -- 然后其SQL语句就根据你的需要去改写就OK啦!
--你是想返回游标吧
create or replace procedure sp_test(o_data out sys_refcursor)
as
begin
open o_data for select * from table;
end;
type CURSOR1 is REF CURSOR;
然后存储过程中定义一个 pd_1(pd_cursor out CURSOR1 )就可以返回一个结果集了。
is
begin
open P_CURSOR for select * from table1;
end;
create view aa view as select * from tb_test
tb_test(ID CHAR(2),NAME VARCHAR2(10))
--创建存储过程
create or replace procedure sp_return_view
(ret_cursor out sys_refcursor) is
sqlstr varchar2(100);
n_count number;
begin
select count(*) into n_count from aa;
if n_count=0 then
insert into aa values('30','xiaowang');
else
sqlstr:='selece * from aa';
execute immediate sqlstr;
open ret_cursor for sqlstr;
end if;
exception
when others then
dbms_output.put_line('发生其他错误,请核对代码是否正确!!');
end sp_return_view;调用过程declare
ret_cursor_value sys_refcursor;
view_info tb_test%rowtype;
begin
sp_return_view(ret_cursor_value);
loop
fetch ret_cursor_value into view_info ;
dbms_output.put_line(view_info.id||','||view_info.name);
exit when %notfound ;
end loop;ret_cursor_value
end;
-- 如果要返回视图里面的数据,就跟返回表里面的数据是一回事撒!-- 请看例子:
-- 实例:Oracle存储过程返回数据集!CREATE table userinfo(id number(18,0), name varchar2(30), sex varchar2(10), age number(3,0), address varchar2(100));insert into userinfo(id,name,sex,age,address) values(1,'luoyoumou','男',33,'湖南省衡阳市');
insert into userinfo(id,name,sex,age,address) values(2,'miaoxiaoming','男',32,'江西省吉安市');
insert into userinfo(id,name,sex,age,address) values(3,'hanqiguang','男',28,'江西省赣州市');commit;create table userinfo2 as select * from userinfo where 1=2;-- i_address 是存储过程的输入参数,o_cur是存储过程的输出游标参数,用以获取返回的结果集!
CREATE OR REPLACE PROCEDURE userinfo_proc(i_address VARCHAR2, o_cur OUT SYS_REFCURSOR)
IS
sqlstr VARCHAR2(200); -- 定义变量,用以存放SQL语句
BEGIN
sqlstr := 'SELECT Id, Name, Sex, Age, Address FROM userinfo WHERE Address = :i_address'; -- 给SQL变量赋值,其中 :i_address 是绑定变量,以提高执行效率!
OPEN o_cur FOR sqlstr USING i_address; -- 给游标变量赋值
END;
/-- userinfo 是一个表的名字,如果要查询视图的结果,就将表的名字替换成你的视图的名字,
-- 然后其SQL语句就根据你的需要去改写就OK啦!