pipeline 例項

chaobaojun發表於2013-04-01

 

CREATE OR REPLACE TYPE Lookup_Row AS OBJECT
(
  Idx  NUMBER,
  Text VARCHAR2(20)
)

create or replace type lookups_tab as table of lookup_row

CREATE OR REPLACE FUNCTION Lookups_Fn RETURN Lookups_Tab
  PIPELINED IS
  v_Row Lookup_Row;
BEGIN
  FOR j IN 1 .. 10 LOOP
    v_Row := CASE j
               WHEN 1 THEN
                Lookup_Row(1, 'one')
               WHEN 2 THEN
                Lookup_Row(2, 'TWO')
               WHEN 3 THEN
                Lookup_Row(3, 'three')
               WHEN 4 THEN
                Lookup_Row(4, 'FOUR')
               WHEN 5 THEN
                Lookup_Row(5, 'five')
               WHEN 6 THEN
                Lookup_Row(6, 'SIX')
               WHEN 7 THEN
                Lookup_Row(7, 'seven')
               ELSE
                Lookup_Row(j, 'other')
             END;
    PIPE ROW(v_Row);
  END LOOP;
  RETURN;
END Lookups_Fn;

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

  PIPELINED(關鍵字)表明這是一個管道函式,管道函式的返回值型別必須為集合,在函式中,PIPE ROW語句被用來返回該集合的單個元素,函式則以一個空的RETURN語句結束,以表明它已經完成。

第二個例項:

create or replace type MsgType as table of varchar2(4000)

CREATE OR REPLACE FUNCTION f_Pipeline_Test RETURN Msgtype
  PIPELINED AS
BEGIN
  FOR i IN 1 .. 10 LOOP
    PIPE ROW('Iteration ' || i || ' at ' || Systimestamp);
    --Dbms_Lock 包要授權,要不提示沒有定義 grant execute on dbms_lock to wms_ls;

      dbms_lock.sleep(seconds => 1);
  END LOOP;
  PIPE ROW('All done!');
  RETURN;
END;

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

相關文章