- 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;
如果我的第二种情况是正确的,那么上面的代码是如何工作的?