страничка из www.sql.ru

 Интереса ради: процедура как таблица   [new]
IgorMan2
Member

Откуда:
Сообщений: 92
Можно ли использовать процедуру как таблицу?
н-р:

select * from my_proc1(param1, param2)

Или на это дело есть что-то другое?
вчера, 15:21    [803293] Цитировать

 Re: Интереса ради: процедура как таблица   [new]
*
Guest
Можно так, только нужно ли:

SQL> create or replace type T is object
2 (
3 C VARCHAR2(3),
4 N NUMBER
5 );
6 /

Type created.

SQL> create or replace type TA is table of T;
2 /

Type created.

SQL> create or replace function VT(p_num_rows in number)
2 return TA
3 pipelined -- !!!
4 is
5 begin
6 for i in 1 .. p_num_rows loop
7 pipe row(T(TO_CHAR(i),i));
8 end loop;
9
10 return; -- !!!
11 end;
12 /

Function created.

SQL> select * from table(cast(VT(10) as TA));

C N
--- ----------
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10

10 rows selected.
вчера, 15:27    [803316] Цитировать

 Re: Интереса ради: процедура как таблица   [new]
IgorMan2
Member

Откуда:
Сообщений: 92
А есть какая-нибудь альтернатива? Допустим у меня есть выходная форма в виде таблицы (информационного плана), но заполнить эту таблицу я не могу полько одним SQL запросом. Для этого я в InterBase использовал процедуру, данные из которой забирал методом select * from my_proc(). А как такое дело организовывается в Oracle?
сегодня, 06:40    [804722] Цитировать

 Re: Интереса ради: процедура как таблица   [new]
use-se
Member

Откуда: Пермь
Сообщений: 26
Кроме табличной функции есть еще курсоры. Твоя процедура может открыть курсор, который можно передать в другую процедуру для обработки или табличную функцию. Практика критерий истины + документация (а там примеры)
сегодня, 07:13    [804742] Цитировать

 Re: Интереса ради: процедура как таблица   [new]
pnv
Member

Откуда:
Сообщений: 24
Мне эта тема тоже показалась интересной. в примере на выходе таблица, а курсор можно изменять от входных параметров.

create or replace TYPE T_TYPE_SEL as table of TYPE_SEL;

FUNCTION F_SEL(параметры) return T_TYPE_SEL
TYPE TCUR IS REF CURSOR;
CUR TCUR;
l_data T_TYPE_SEL:=T_TYPE_SEL() ;
l_row TYPE_SEL:=TYPE_SEL(null, null, null, null, null, null, null);
sql1 varchar(2048);
sql2 varchar(2048);

begin
sql1:= ' select первый';

sql2:=' select второй';
i:=0;
if условие then
open CUR for sql1;
else
open CUR for sql2;
end if;
LOOP
FETCH cur INTO l_row.c1,l_row.c2,l_row.c3,l_row.c4,l_row.c5,l_row.c6,l_row.c7;
EXIT WHEN cur%NOTFOUND;
i:=i+1;
l_data.extend;
l_data(i):=l_row;
end loop;
close cur;
return l_data;
end;
сегодня, 09:56    [804977] Цитировать
Хостинг от uCoz