oracle – 表函数和流水线函数之间的区别?
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是流水线函数. 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; 如果我的第二种情况是正确的,那么上面的代码是如何工作的? 流水线函数,一个非常经典的例子是在SQL * Plus中执行SELECT * FROM表名.会发生什么,Oracle从表中传输数据..
请注意“Streaming”这个词.在我们的函数中,我们定义了我们流的行数.每个流行都可以立即供调用者使用.流水线意味着非专业人士,不要让我等到你完成,给我你所拥有的,并继续处理和更新我同时. 在你的最后一个程序中,在管道每一行之后,你发起一个10秒的睡眠呼叫,所以记录每10秒流到一个呼叫者. 并且,正常的表函数将一直等待所有处理工作完成,然后它将返回对结果集游标的引用. 流水线功能,他们声称节省内存,是通过立即刷新内容,因此使用的缓冲区总是最小的,而往返计数更高. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |