gpt4 book ai didi

oracle - 表函数和流水线函数的区别?

转载 作者:行者123 更新时间:2023-12-02 05:57:20 25 4
gpt4 key购买 nike

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;

如果我的第二种情况是正确的,那么上面的代码是如何工作的?

最佳答案

流水线函数,一个非常经典的例子是在SQL*Plus中执行SELECT * FROM table name。发生的情况是,Oracle 从表中传输数据..

Like watching a video in youtube.

请注意“流式传输”这个词。在我们的函数中,我们定义了流式传输的行数。调用者可以立即使用每个流式传输行。 Pipeiling 用外行人的话说,不要让我等到你完成,给我你拥有的一切,并继续同时处理和更新我。

在上一个过程中,在对每一行进行管道传输后,您启动 sleep 调用,持续 10s ,因此记录流式传输给调用者每 10 秒一次。

并且,普通的表函数将一直等待,直到所有处理工作完成,然后它将返回对结果集游标的引用。

他们声称,管道函数可以通过立即刷新内容来节省内存,因此使用的缓冲区始终很小,而往返次数却更高。

关于oracle - 表函数和流水线函数的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21171349/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com