pipeline function管道函式

pwz1688發表於2014-10-10

      oracle管道函式是一類特殊的函式,oracle管道函式返回值型別必須為集合。

      在普通的函式中,使用dbms_output輸出的資訊,需要在伺服器執行完整個函式後一次性的返回給客戶端。如果需要在客戶端實時的輸出函式執行過程中的一些資訊,在oracle9i以後可以使用管道函式(pipeline function)。

      關鍵字PIPELINED表明這是一個oracle管道函式,oracle管道函式的返回值型別必須為集合,在函式中,PIPE ROW語句被用來返回該集合的單個元素,函式以一個空的RETURN 語句結束,以表明它已經完成。接下來演示一下管道函式的實際用法。
 
       在建立管道函式之前必須建立一個用於存放管道函式返回值的型別,因為管道的返回值可以看做是一個虛表。

1、建立type物件

SQL> create or replace type MsgType as table of varchar2(4000);
  2  /

型別已建立。

2、建立管道函式,注意PIPELINED關鍵字和pipe的用法

SQL> create or replace function f_pipeline_test return MsgType
  2  pipelined as
  3  begin
  4    for i in 1 .. 10 loop
  5      pipe row('Iteration'||i||'at'systimestamp);
  6      sys.dbms_lock.sleep(1);
  7    end loop;
  8  pipe row('all done!');
  9  return;
 10  end;
 11  /

警告: 建立的函式帶有編譯錯誤。

以上function編譯錯誤詳細資訊為:“Error: PLS-00201: 必須說明識別符號 'DBMS_LOCK'”,這是由於授權的原因,可通過如下方案解決:

SQL> conn sys/oracle as sysdba
已連線。
SQL> grant execute on dbms_lock to test;

授權成功。

SQL> conn test/test
已連線。
在sql*plus中執行該函式,首先設定arraysize為1,否則伺服器會按照預設的15來向客戶端返回資訊,這會影響我們的測試效果。

SQL> set arraysize 1
SQL> select * from table(f_pipeline_test);

COLUMN_VALUE
--------------------------------------------------------------------------

Iteration1at10-10月-14 10.49.50.533000000 上午 +08:00
Iteration2at10-10月-14 10.49.51.563000000 上午 +08:00
Iteration3at10-10月-14 10.49.52.577000000 上午 +08:00
Iteration4at10-10月-14 10.49.53.591000000 上午 +08:00
Iteration5at10-10月-14 10.49.54.605000000 上午 +08:00
Iteration6at10-10月-14 10.49.55.619000000 上午 +08:00
Iteration7at10-10月-14 10.49.56.633000000 上午 +08:00
Iteration8at10-10月-14 10.49.57.647000000 上午 +08:00
Iteration9at10-10月-14 10.49.58.661000000 上午 +08:00
Iteration10at10-10月-14 10.49.59.675000000 上午 +08:00
all done!

已選擇11行。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21251711/viewspace-1293869/,如需轉載,請註明出處,否則將追究法律責任。

相關文章