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','10-JUN-2013')); PIPE ROW (TY_1('B','11-JUN-2013')); PIPE ROW (TY_1('C','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函数如何节省内存?
如果我没有错,它将管道所有行并将它们存储在内存区域中,然后在控制台中打印所有行.或者就是这样,只要在控制台中输入新记录而不将其存储在任何地方,就会直接逐行打印?
CREATE OR REPLACE FUNCTION FN_RET_COL RETURN TY_1_TABLE PIPELINED IS BEGIN PIPE ROW(TY_1('A','10-JUN-2013')); DBMS_LOCK.sleep(seconds => 10); PIPE ROW(TY_1('B','11-JUN-2013')); DBMS_LOCK.sleep(seconds => 10); PIPE ROW(TY_1('C','12-JUN-2013')); END;
如果我的第二种情况是正确的,那么上面的代码是如何工作的?