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

时间:2022-08-17 06:00:29
存储过程中,循环游标获每次取一个ID,把id传到一条Sql查询语句,这个查询返回一个一条记录。
现在的问题就是怎么把这些记录作为结果集返回啊??

10 个解决方案

#1


这个 可以在程序里面一行一行读取保存  实例化类保存数据    

#2


在程序中保存的话,就是要把存储过程中的循环拿到程序中,每次都传递一个ID去查询,然后返回保存,这样是不是就要多次去连接数据库读取数据?能一次获取出来吗?

#3


自定义类型

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;

#4


引用楼主  的回复:
存储过程中,循环游标获每次取一个ID,把id传到一条Sql查询语句,这个查询返回一个一条记录。
现在的问题就是怎么把这些记录作为结果集返回啊??

定义一个数组,把值放到数组里,然后返回

#5



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

#6


数组就可以了,一次返回。

#7


在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;

#8


使用数组

#9


建立一个临时表,然后存储过程里面向临时表里插入数据。

外部程序查询这个临时表就可以了。

#10


学习,不过觉得临时表应该也是不错的方式 

引用 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 ……

#1


这个 可以在程序里面一行一行读取保存  实例化类保存数据    

#2


在程序中保存的话,就是要把存储过程中的循环拿到程序中,每次都传递一个ID去查询,然后返回保存,这样是不是就要多次去连接数据库读取数据?能一次获取出来吗?

#3


自定义类型

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;

#4


引用楼主  的回复:
存储过程中,循环游标获每次取一个ID,把id传到一条Sql查询语句,这个查询返回一个一条记录。
现在的问题就是怎么把这些记录作为结果集返回啊??

定义一个数组,把值放到数组里,然后返回

#5



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

#6


数组就可以了,一次返回。

#7


在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;

#8


使用数组

#9


建立一个临时表,然后存储过程里面向临时表里插入数据。

外部程序查询这个临时表就可以了。

#10


学习,不过觉得临时表应该也是不错的方式 

引用 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 ……