Re[5]: Я просто туплю Oracle
От: Quadro  
Дата: 22.07.05 08:04
Оценка:
А>Хорошо, как мне построить функцию, что бы ее можно было так вызывать?


-- Тип записи, который будет возвращать запрос
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 на результат выборки из табличной функции.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.