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;
如果我的第二種情況是正確的,那麼上面的代碼是如何工作的?
精湛的解釋..很明顯.. – ramesh538
謝謝,請接受,如果你滿意! :) –
CREATE OR REPLACE FUNCTION FN_RET_COL RETURN TY_1_TABLE PIPELINED IS 在 BEGIN 對於i(SELECT名字,SALARY,HIRE_DATE FROM EMPLOYEES WHERE ROWNUM <11)環 PIPE ROW(TY_1(i.FIRST_NAME,i.SALARY, i.HIRE_DATE)); DBMS_LOCK.sleep(秒=> 1); end loop; END; SELECT A.FN,LOCALTIMESTAMP FROM TABLE(FN_RET_COL)A; 在這裏,我得到像表函數一樣的時間。爲什麼?其實它應該儘快返回一排管道。 – ramesh538