2013-01-21 2 views
0

У меня есть хранимая процедура, какВозврат строки из хранимой процедуры без ref_cursor

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

Мой результат должен быть как

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

Я не в состоянии получить выше типа массива результата, как я могу в состоянии получить его (без ref_cursor и ref_cursor)?

+0

@DazzaL Я хочу два решения. Одно решение без использования ref_cursor. Другое решение с ref_cursor. – Sai

ответ

4

«без ref_cursor и ref_cursor» немного запутанно. без и с?

, но ваши выходы, если ваш отказ от REF CURSOR, должны быть выходными массивами.

например:

создать эти типы:

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

затем:

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. 

или лучше, как конвейерные функции:

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 со скалярными массивами:

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> 
+0

Спасибо! Но моя процедура должна иметь два параметра sid и sname. Мне нужно выполнить процедуру, используя мой адаптер OracleSOA Database. – Sai

+0

@Sai, тогда мы можем иметь два выходных массива вместо одного составного. – DazzaL

Смежные вопросы