oracle – 表函数和流水线函数之间的区别?

前端之家收集整理的这篇文章主要介绍了oracle – 表函数和流水线函数之间的区别?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  1. CREATE OR REPLACE TYPE ty_1 AS OBJECT ( fn VARCHAR2(100),sl NUMBER,hd DATE );
  2. CREATE OR REPLACE TYPE ty_1_table AS TABLE OF ty_1;
  3.  
  4. CREATE OR REPLACE FUNCTION FN_RET_COL
  5. RETURN ty_1_table
  6. AS
  7. c ty_1_table := TY_1_TABLE();
  8. BEGIN
  9. c.extend;
  10. C(1) := TY_1('A',1,'10-JUN-2013');
  11. c.extend;
  12. C(2) := TY_1('B',2,'11-JUN-2013');
  13. c.extend;
  14. C(3) := TY_1('C',3,'12-JUN-2013');
  15.  
  16. RETURN c;
  17. END;
  18.  
  19. CREATE OR REPLACE FUNCTION FN_RET_PIPE RETURN ty_1_table PIPELINED IS
  20. BEGIN
  21. PIPE ROW (TY_1('A','10-JUN-2013'));
  22. PIPE ROW (TY_1('B','11-JUN-2013'));
  23. PIPE ROW (TY_1('C','12-JUN-2013'));
  24. END;
  25.  
  26. SELECT * FROM TABLE (fn_ret_col);
  27.  
  28. SELECT * FROM TABLE (fn_ret_pipe);

第一个FN_RET_COL是常规表函数,第二个FN_RET_PIPE是流水线函数.
我在一本书中学习过
常规表函数要求在将集合作为PIPELINED FUNCTION返回之前完全填充集合
使用PIPE ROW调用在创建行时将行推出函数,而不是构建表集合.在生成所有行之前保存内存并允许后续处理.
我的疑问是:PIPELINED函数如何节省内存?
如果我没有错,它将管道所有行并将它们存储在内存区域中,然后在控制台中打印所有行.或者就是这样,只要在控制台中输入新记录而不将其存储在任何地方,就会直接逐行打印?

  1. CREATE OR REPLACE FUNCTION FN_RET_COL RETURN TY_1_TABLE
  2. PIPELINED IS
  3. BEGIN
  4. PIPE ROW(TY_1('A','10-JUN-2013'));
  5. DBMS_LOCK.sleep(seconds => 10);
  6. PIPE ROW(TY_1('B','11-JUN-2013'));
  7. DBMS_LOCK.sleep(seconds => 10);
  8. PIPE ROW(TY_1('C','12-JUN-2013'));
  9. END;

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

流水线函数,一个非常经典的例子是在sql * Plus中执行SELECT * FROM表名.会发生什么,Oracle从表中传输数据..

Like watching a video in youtube.

请注意“Streaming”这个词.在我们的函数中,我们定义了我们流的行数.每个流行都可以立即供调用者使用.流水线意味着非专业人士,不要让我等到你完成,给我你所拥有的,并继续处理和更新我同时.

在你的最后一个程序中,在管道每一行之后,你发起一个10秒的睡眠呼叫,所以记录每10秒流到一个呼叫者.

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

流水线功能,他们声称节省内存,是通过立即刷新内容,因此使用的缓冲区总是最小的,而往返计数更高.

猜你在找的Oracle相关文章