存储过程如何返回多条数据?????

lv5956047122 2012-03-29 04:03:50
存储过程中,循环游标获每次取一个ID,把id传到一条Sql查询语句,这个查询返回一个一条记录。
现在的问题就是怎么把这些记录作为结果集返回啊??
...全文
612 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
larrychen_bmw 2012-04-10
  • 打赏
  • 举报
回复
学习,不过觉得临时表应该也是不错的方式

[Quote=引用 5 楼 的回复:]

SQL code

SQL> create or replace function f_test return dbms_sql.Varchar2_Table as
2 v_ename_table dbms_sql.Varchar2_Table;
3 begin
4 select ename bulk collect into v_ename_table from ……
[/Quote]
renfengjun 2012-04-07
  • 打赏
  • 举报
回复
建立一个临时表,然后存储过程里面向临时表里插入数据。

外部程序查询这个临时表就可以了。
宇宙漫步者 2012-04-07
  • 打赏
  • 举报
回复
使用数组
ssqtjffcu 2012-03-31
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
存储过程中,循环游标获每次取一个ID,把id传到一条Sql查询语句,这个查询返回一个一条记录。
现在的问题就是怎么把这些记录作为结果集返回啊??
[/Quote]
定义一个数组,把值放到数组里,然后返回
物润声无 2012-03-31
  • 打赏
  • 举报
回复
在procedure中用一个cursor返回需要的结果集,设置一个标记变量,用于fetch 该cursor时记录cursor的状态。将每一次fetch的内容和标记变量同时传出。
在应用程序中循环调用该procedure,通过返回的标记变量判断是否退出该循环。
大致过程如下:

create or replace procedure test(id IN INT, cont OUT VARCHAR2, flg OUT CHAR) IS
CURSOR test_cur(v_id) IS
SELECT ...
flg := '0';
v_record test_cur%TYPE;
begin
IF test_cur IS NOT OPEN THEN
OPEN test_cur(id);
END IF;

IF test_cur IS OPEN THEN
FETCH test_cur
INTO v_record

cont := v_record....

IF test_cur NOT FOUND THEN
flg:='1';
END IF;

END IF;


end test;


DECLARE
flg CHAR;
cont VARCHAR2;
BEGIN
LOOP
test(1,cont,flg);
... --deal with cont
EXIT WHEN flg='1';
END LOOP;

END;
我心飞翔 2012-03-31
  • 打赏
  • 举报
回复
数组就可以了,一次返回。
ssqtjffcu 2012-03-31
  • 打赏
  • 举报
回复

SQL> create or replace function f_test return dbms_sql.Varchar2_Table as
2 v_ename_table dbms_sql.Varchar2_Table;
3 begin
4 select ename bulk collect into v_ename_table from emp;
5 return v_ename_table;
6 end;
7 /

Function created

SQL>
SQL> set serveroutput on;
SQL> declare
2 v_ename_table dbms_sql.Varchar2_Table;
3 begin
4 v_ename_table := f_test;
5 for i in 1..v_ename_table.count loop
6 dbms_output.put_line(v_ename_table(i));
7 end loop;
8 end;
9 /

SMIT H1
ALLE N
WARD
JONE S
MART IN
BLAK E
CLAR K
SCOT T
KING
TURN ER
ADAM S
JAME S
FORD
MILL ER

PL/SQL procedure successfully completed
  • 打赏
  • 举报
回复
自定义类型

create or replace type myRow is object (id int,name varchar(20));

create or replace type myTable is table of myRow;

create or replace procedure testProcedure(p_mytable out myTable)
as
v_myrow myRow := myRow(null,null);

begin
p_mytable := myTable();

v_myrow.id := 100;
v_myrow.name := 'a';
p_mytable.extend;
p_mytable(p_mytable.count) := v_myrow;

v_myrow.id := 200;
v_myrow.name := 'b';
p_mytable.extend;
p_mytable(p_mytable.count) := v_myrow;

v_myrow.id := 300;
v_myrow.name := 'c';
p_mytable.extend;
p_mytable(p_mytable.count) := v_myrow;
end testProcedure;
lv5956047122 2012-03-29
  • 打赏
  • 举报
回复
在程序中保存的话,就是要把存储过程中的循环拿到程序中,每次都传递一个ID去查询,然后返回保存,这样是不是就要多次去连接数据库读取数据?能一次获取出来吗?
  • 打赏
  • 举报
回复
这个 可以在程序里面一行一行读取保存 实例化类保存数据

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧