Вот пакет с двумя конвейерными функциями:
create or replace type tq84_line as table of varchar2(25);
/
create or replace package tq84_pipelined as
function more_rows return tq84_line pipelined;
function go return tq84_line pipelined;
end tq84_pipelined;
/
В соответствующем корпусе упаковки:
create or replace package body tq84_pipelined as
function more_rows return tq84_line pipelined is
begin
pipe row('ist');
pipe row('Eugen,');
return;
end more_rows;
function go return tq84_line pipelined is
begin
pipe row('Mein');
pipe row('Name');
/* start */
for next in (
select column_value line from table(more_rows)
)
loop
pipe row(next.line);
end loop;
/* end */
pipe row('ich');
pipe row('weiss');
pipe row('von');
pipe row('nichts.');
end go;
end tq84_pipelined;
/
Важно то, что вроде звонков more_rows
с for next in ...
между /* start */
и /* end */
Я могу использовать пакет следующим образом:
select * from table(tq84_pipelined.go);
Это все прекрасно, но я надеялся, что смогу заменить строки между /* start */
и /* end */
простым вызовом more_rows
.
Однако это, очевидно, невозможно, так как он генерирует PLS-00221: «MORE_ROWS» не является процедурой или не определено .
Итак, мой вопрос: неужели нет способа сократить цикл?
EDIT
Очевидно, что из ответов до сих пор мой вопрос был неясен.
Пакет, как заявлено, работает.
Но меня беспокоит 6 (то есть: ШЕСТЬ) строк между маркерами /* start */
и /* end */
. Я хотел бы заменить их одной строкой. Но я не нашел никакого способа сделать это.