А>Хорошо, как мне построить функцию, что бы ее можно было так вызывать?
-- Тип записи, который будет возвращать запрос
SQL> create or replace type all_objects_row as object
2 (
3 object_id number,
4 object_name varchar2(30)
5 );
6 /
Type created.
--Табличный тип для записей
SQL> create or replace type all_objects_row_t as table of all_objects_row;
2 /
Type created.
--pipelined табличная функция для возврата результата. Условие where будет передаваться в качестве параметра этой функции, из которого мы будем формировать ref cursor для возврата результата.
SQL> create or replace function test(
2 p_where varchar2
3 ) return all_objects_row_t pipelined is
4 type ref_cursor is ref cursor;
5 l_cur ref_cursor;
6 type cur_row is record (object_id number, object_name varchar2(30));
7 type cur_row_array is table of cur_row index by binary_integer;
8 l_buffer cur_row_array;
9 begin
10 open l_cur for 'select object_id, object_name from all_objects '||p_where;
11
12 loop
13 fetch l_cur bulk collect into l_buffer limit 1000;
14
15 for i in 1 .. l_buffer.count
16 loop
17 pipe row (all_objects_row(l_buffer(i).object_id, l_buffer(i).object_name));
18 end loop;
19
20 exit when l_cur%notfound;
21 end loop;
22
23 close l_cur;
24 return;
25 end;
26 /
Function created.
Function created.
--Теперь из этой функции можно делать обычные выборки
SQL> select * from table(test('where object_id=30048'));
OBJECT_ID OBJECT_NAME
---------- ------------------------------
30048 SQLDEFINITIONSEQUENCE
SQL> select * from table(test('where object_name=''TEST'''));
OBJECT_ID OBJECT_NAME
---------- ------------------------------
43274 TEST
SQL> select * from table(test(null)) where object_name='TEST';
OBJECT_ID OBJECT_NAME
---------- ------------------------------
43274 TEST
Помните — на табличных функциях не может быть индекса, именно поэтому зачастую лучше передавать where в качестве параметра, чем накладывать условие where на результат выборки из табличной функции.