Oracle: преобразовать частичный выбор в конвейерную функцию?

Как в общем случае преобразовать частичный выбор в конвейерный вызов функции?

Например, как бы я это перевел:

select id, stuff from t1 where id in (select unique id from kw where k = 'foo')

к этому:

select id, stuff from t1 where id in (select id from table(has_kw('foo'))

person Mark Harrison    schedule 23.01.2015    source источник
comment
Оба этих запроса должны быть id in (subquery), а не id = (subquery)? Итак, вы просто спрашиваете, как написать конвейерную табличную функцию?   -  person Justin Cave    schedule 23.01.2015


Ответы (1)


Написание конвейерной табличной функции относительно просто

CREATE TYPE num_tbl AS TABLE OF NUMBER;

CREATE FUNCTION has_kw( p_k IN VARCHAR2 )
  RETURN num_tbl
  PIPELINED
IS
BEGIN
  FOR i IN (SELECT DISTINCT id FROM kw WHERE k = p_k)
  LOOP
    PIPE ROW( i.id );
  END LOOP;
  RETURN;
END;

Я не уверен, что действительно имеет смысл использовать здесь конвейерную табличную функцию. Но, возможно, ваш реальный вариант использования более сложен, и конвейерная табличная функция будет более подходящей.

person Justin Cave    schedule 23.01.2015
comment
Спасибо, Джастин ... ты прав, моя заявка посложнее. Это идеальный минималистичный пример. Все другие примеры, которые я смог найти, также создавали тип строки и имели более бесплатную обработку в теле функции. - person Mark Harrison; 23.01.2015