How To Return Multiple Rows From Oracle Stored Procedure From Multiple Cursors?
Solution 1:
My suggestion is going to be insert the rows from your cursor into a temporary table. Then join the temporary table with your existing table for the filter criteria you mention. Psuedocode:
createor replace function my_func
return sysrefcursor
iscursor cursor_one isSELECT*FROM table_one ;
cursor cursor_two isSELECT*FROM table_one ;
BEGINFORcurrent_rowin cursor_one
loop
-- do some modification on each row and insert into temporary tableend loop;
FORcurrent_rowin cursor_two
loop
-- do some modification on each row and insert into temporary tableend loop;
-- results from cursor 1 and 2 exist in temporary tableopen out_cursor forselect t.*from
my_temp_table t
join
my_other_table tt
on (t.col1 = tt.col1) -- or whatever columns are appropriatewhere t.col2 ='some criteria'-- or whatever filter criteria you like.return out_cursor;
END;
Solution 2:
create type emp_obj AS object
(
empno NUMBER (4)
,ename VARCHAR2(10)
,sal number(7,2)
,job varchar2(9)
);
CREATE TYPE EMP_NT ASTABLEOF emp_OBJ;
createor replace package test_pkg
IS
TYPE abc_cur isREFCURSOR;
procedure test_proc
(
p_rec INOUT abc_cur
);
END test_pkg;
/createor replace package body test_pkg
ISprocedure test_proc
(
p_rec INOUT abc_cur
)
IS
v_emp_nt emp_nt;
BEGINSELECT emp_obj(empno,ename,sal,job) BULK COLLECTINTO v_emp_nt FROM EMP;
FOR i in v_emp_nt.first..v_emp_nt.last
LOOP
IF v_emp_nt(i).job='CLERK'THEN
v_emp_nt(i).sal := v_emp_nt(i).sal +200;
ELSIF v_emp_nt(i).job='MANAGER'THEN
v_emp_nt(i).sal := v_emp_nt(i).sal +800;
END IF;
END LOOP;
open p_rec forselect*fromtable(v_emp_nt);
END test_proc;
END test_pkg;
/
As you have seen the code,what i do ,is to get the desired result in nested table
(what your cursor is doing) ,and do some manipulation based on the resultant records ,as well as update the nested table.
At the end i will create a cursor from this updated nested table
and return the cursor after opening.
Now your question :How can you return append cursor
?
It is simple create two nested table ,do some manipulation on both the nested table
Suppose you have v_emp_nt1
as first nested table
,you do some manipulation on that .
you have another v_emp_nt2
as second nested table
,you do some manipulation on that .
Now your cursor
will be like
open p_rec FOR (select*from v_emp_nt1 unionselect*from v_empnt2);
With this way you can achieve your desired output .
**Note:**The above code is for one nested table ,you need to create another nested table for your code to get complete
Solution 3:
create
package my_pkg as
type my_rec is record
(
<list your fields here>
);
type my_rec_tab is table of my_rec;
function get_my_rows
return my_rec_tab pipelined;
end my_pkg;
create
package body my_pkg asfunction get_my_rows
return my_rec_tab pipelined
as
begin
for c_cur in (select * from table_one)
loop
-- do some modification on the current row andreturn the modified row
pipe row (c_cur);
endloop;
for c_cur in (select * from table_one)
loop
-- do some modification on the current row andreturn the modified row
pipe row (c_cur);
endloop;
return;
end get_my_rows;
end my_pkg;
select * from table(my_pkg.get_my_rows);
Post a Comment for "How To Return Multiple Rows From Oracle Stored Procedure From Multiple Cursors?"