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