Różnica między funkcją tabeli a funkcją potokową?

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);

PierwszyFN_RET_COL jest funkcją regularnego stołu i drugąFN_RET_PIPE jest funkcją potokową. Studiowałem w książce, tak jak zwykłe funkcje tabeli wymagają pełnego wypełnienia kolekcji, zanim zostaną zwrócone, gdziePIPELINED FUNCTION UżyjPIPE ROW zadzwoń, aby wypchnąć wiersze z funkcji natychmiast po ich utworzeniu, zamiast tworzyć kolekcję tabel. oszczędność pamięci i umożliwienie rozpoczęcia kolejnego przetwarzania przed wygenerowaniem wszystkich wierszy. Mam wątpliwości: jakPIPELINED Function oszczędzasz pamięć? Jeśli się nie mylę, to pipinguje wszystkie wiersze i zapisuje je w obszarze pamięci, a następnie drukuje wszystkie wiersze w konsoli. A może tak, to bezpośrednio drukuje wiersz po wierszu, gdy tylko nowy rekord zostanie przesłany do konsoli bez zapisywania go w dowolnym miejscu?

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;

Jeśli moja druga sprawa jest właściwa, to jak działa powyższy kod?

questionAnswers(1)

yourAnswerToTheQuestion