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番目のケースが正しい場合、上記のコードはどのように機能しますか?
優れた説明です..クリアです.. – ramesh538
ありがとうございました。 :) –
ループ 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