ram*_*538 6 oracle plsql pipelined-function
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);
Run Code Online (Sandbox Code Playgroud)
第一个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;
Run Code Online (Sandbox Code Playgroud)
如果我的第二种情况是正确的,那么上面的代码是如何工作的?
Mah*_*kar 10
Pipelined函数,一个非常经典的例子是你SELECT * FROM table name在哪里做的SQL*Plus.会发生什么,Oracle从表中传输数据..
喜欢在youtube上观看视频.
请注意" Streaming " 这个词.在我们的函数中,我们定义了我们流的行数.每个流行都可以立即供调用者使用.Pipelining在非专业人士的意思,不要让我等到你完成,给我你所拥有的,并继续处理和更新我同时.
在你的最后一个程序中,在管理每一行之后,你发起一个sleep呼叫10s,所以记录每10秒流到一个呼叫者.
并且,正常的表函数将一直等待所有处理工作完成,然后它将返回对结果集游标的引用.
流水线功能,他们声称节省内存,是由flushing内容立即,因此使用的缓冲区总是最小的,而往返计数更高.
| 归档时间: |
|
| 查看次数: |
3356 次 |
| 最近记录: |