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?