Sai
Sai

Reputation: 81

Return rows from stored procedure without ref_cursor

I have a stored procedure like

create procedure Sample(sid out number,sname out varchar2) is
begin
select id,name into sid,sname from emp;
end;

My result should be like

id      name
------------
1      Sai
5      Hari
8      Nari

I am not able to get above array type of result how can I able to get it (without ref_cursor and with ref_cursor) ?

Upvotes: 0

Views: 281

Answers (1)

DazzaL
DazzaL

Reputation: 21973

"without ref_cursor and with ref_cursor" is a bit confusing. without and with?

but your outputs, if your disallowing a REF CURSOR , have to be array outputs.

eg:

create these types:

create type myemptype as object (id number, name varchar2(200));
/
create type myemptab as table of myemptype;
/

then:

SQL> create or replace procedure Sample(p_tab  out myemptab) is
  2  begin
  3    p_tab := myemptab();
  4    for r_emp in (select id,name from emp order by id)
  5    loop
  6      p_tab.extend;
  7      p_tab(p_tab.last) := myemptype(r_emp.id, r_emp.name);
  8    end loop;
  9  end;
 10  /

Procedure created.

SQL>
SQL> declare
  2    t_emp  myemptab;
  3  begin
  4    sample(t_emp);
  5    for idx in 1..t_emp.count
  6    loop
  7      dbms_output.put_line(t_emp(idx).id || chr(9) || t_emp(idx).name);
  8    end loop;
  9  end;
 10  /
1       Sai
5       Hari
8       Nari

PL/SQL procedure successfully completed.

or better, as a pipelined function:

SQL> create or replace function Sample
  2  return myemptab pipelined
  3  is
  4  begin
  5    for r_emp in (select id,name from emp order by id)
  6    loop
  7      pipe row ( myemptype(r_emp.id, r_emp.name) );
  8    end loop;
  9  end;
 10  /

Function created.


SQL> col name format a10
SQL> select * from table(sample);

        ID NAME
---------- ----------
         1 Sai
         5 Hari
         8 Nari

EDIT with scalar arrays:

SQL> create type myempidtab as table of number;
  2  /

Type created.

SQL> create type myempnametab as table of varchar2(20);
  2  /

Type created.

SQL> create or replace procedure Sample(p_id out myempidtab ,p_name out myempnametab) is
  2  begin
  3    p_id := myempidtab();
  4    p_name := myempnametab();
  5    for r_emp in (select id,name from emp order by id)
  6    loop
  7      p_id.extend;
  8      p_name.extend;
  9      p_id(p_id.last) := r_emp.id;
 10      p_name(p_name.last) := r_emp.name;
 11    end loop;
 12  end;
 13  /

Procedure created.

SQL> declare
  2    t_id    myempidtab;
  3    t_name  myempnametab;
  4  begin
  5    sample(t_id, t_name);
  6    for idx in 1..t_id.count
  7    loop
  8      dbms_output.put_line(t_id(idx) || chr(9) || t_name(idx));
  9    end loop;
 10  end;
 11  /
1       Sai
5       Hari
8       Nari

PL/SQL procedure successfully completed.

SQL>

Upvotes: 4

Related Questions