【发布时间】:2014-01-16 19:44:14
【问题描述】:
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;
如果我的第二种情况是正确的,那么上面的代码是如何工作的?
【问题讨论】:
标签: oracle plsql pipelined-function