Re[6]: Я просто туплю Oracle
От: Аноним  
Дата: 22.07.05 08:36
Оценка:
Здравствуйте, 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 на результат выборки из табличной функции.


Ну пример из книжки я и сам смог прочитать, хотя спасибо за внимание.

Вы мне пример привидите с моей таблицей, а не с объектом Оракловым
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.