Разница между табличной функцией и конвейерной функцией?

CREATE OR REPLACE TYPE ty_1 AS OBJECT ( fn VARCHAR2(100),
                                        sl NUMBER,
                                        hd DATE );
CREATE OR REPLACE TYPE ty_1_table AS TABLE OF ty_1;

CREATE OR REPLACE FUNCTION FN_RET_COL
  RETURN ty_1_table
AS
  c ty_1_table := TY_1_TABLE();
  BEGIN
    c.extend;
    C(1) := TY_1('A', 1, '10-JUN-2013');
    c.extend;
    C(2) := TY_1('B', 2, '11-JUN-2013');
    c.extend;
    C(3) := TY_1('C', 3, '12-JUN-2013');

    RETURN c;
  END;

CREATE OR REPLACE FUNCTION FN_RET_PIPE RETURN ty_1_table PIPELINED IS
  BEGIN
    PIPE ROW (TY_1('A', 1, '10-JUN-2013'));
    PIPE ROW (TY_1('B', 2, '11-JUN-2013'));
    PIPE ROW (TY_1('C', 3, '12-JUN-2013'));
  END;

SELECT * FROM TABLE (fn_ret_col);

SELECT * FROM TABLE (fn_ret_pipe);

ПервыйFN_RET_COL обычная табличная функция и втораяFN_RET_PIPE является конвейерной функцией. Я изучал в книге, как обычные табличные функции требуют, чтобы коллекции были полностью заполнены, прежде чем они будут возвращены, где какPIPELINED FUNCTION использоватьPIPE ROW вызов, чтобы вытолкнуть строки из функции, как только они будут созданы, а не создавать коллекцию таблиц. сохранение памяти и возможность последующей обработки до того, как будут сгенерированы все строки. Мое сомнение: какPIPELINED Function сохраняет память? Если я не ошибаюсь, он обвязывает все строки и сохраняет их в области памяти, а затем печатает все строки в консоли. Или это похоже на прямую печать строки за строкой, как только новая запись передается в консоль, нигде не сохраняясь?

CREATE OR REPLACE FUNCTION FN_RET_COL RETURN TY_1_TABLE
 PIPELINED IS
 BEGIN   
    PIPE ROW(TY_1('A',1,'10-JUN-2013'));
    DBMS_LOCK.sleep(seconds => 10);
    PIPE ROW(TY_1('B',2,'11-JUN-2013'));
    DBMS_LOCK.sleep(seconds => 10);
    PIPE ROW(TY_1('C',3,'12-JUN-2013'));
 END;

Если мой второй случай верен, то как работает приведенный выше код?

Ответы на вопрос(1)

Ваш ответ на вопрос