2014-01-16 19 views
6
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であり、もう1つは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; 

私の2番目のケースが正しい場合、上記のコードはどのように機能しますか?

答えて

9

Pipelinedの機能は、非常に古典的な例ですSELECT * FROM table nameSQL*Plusにします。何が起こるかは、Oracleは表のデータをストリームします。

動画をYouTubeで見ているようです。

すべて行をストリーミング..「ストリーミング」、言葉の点に注意してください。そして、我々の機能に我々はストリーミングどのように多くの行を定義してください呼び出し元にすぐに利用可能です。 Pipeliningは、あなたが完了するまであなたを待っていて、あなたが今まで持っていたものを私に与え、処理と更新を同時に続けます。あなたの最後の手順で

は、すべての行をパイプした後、あなたは10sためsleep通話を開始、そのレコードは、すべて10秒呼び出し側にストリーミングです。

通常のテーブル関数は、すべての処理が完了するまで待ってから、結果セット・カーソルへの参照を返します。

パイプライン機能は、メモリを節約すると主張しており、内容はすぐにflushingであるため、使用されるバッファは常に最小限に抑えられますが、往復回数は高くなります。

+1

優れた説明です..クリアです.. – ramesh538

+0

ありがとうございました。 :) –

+0

ループ PIPEのROW(TY_1(i.FIRST_NAME、i.SALARY、(従業員ROWNUM <11 からHIRE_DATEをFIRST_NAME、SALARYを選択)FUNCTION FN_RET_COL RETURN TY_1_TABLE PIPELINEDは にiについて をBEGIN IS CREATE OR REPLACE i.HIRE_DATE)); DBMS_LOCK.sleep(秒=> 1); エンドループ。 END; SELECT A.FN、LOCALTIMESTAMP FROM TABLE(FN_RET_COL)A; ここでは、テーブル機能と同じようになっています。どうして?実際には、行がパイプされるとすぐに戻ります。 – ramesh538