簡體   English   中英

為什么流水線 function 像普通表 function 一樣工作?

[英]Why the pipelined function working like normal table function?

我創建了一個流水線 function 和另一個非流水線 function。
但是當從 select 語句調用這兩個函數時,所有結果僅在循環執行完成后才會顯示。

為什么每行的數據准備好后,流水線 function 沒有返回值?

SELECT * FROM TABLE(GET_TAB(10,1));--Normal function call
SELECT * FROM TABLE(GET_TAB_P(10,1));--Pipelined function call

create or replace TYPE T_TF_ROW AS OBJECT(CNT NUMBER, DESCRIPTION VARCHAR2(50));
create or replace TYPE T_TF_TAB AS TABLE OF T_TF_ROW;

create or replace FUNCTION GET_TAB(P_ROWS IN NUMBER, P_SLEEP IN NUMBER)
RETURN T_TF_TAB
AS
V_T_TF_TAB T_TF_TAB:=T_TF_TAB();
BEGIN
FOR I IN 1..P_ROWS LOOP
DBMS_LOCK.SLEEP(P_SLEEP);
V_T_TF_TAB.EXTEND;
V_T_TF_TAB(V_T_TF_TAB.LAST):=T_TF_ROW(I,'DESCRIPTION OF : '||I);
END LOOP;
RETURN V_T_TF_TAB;
END;


create or replace FUNCTION GET_TAB_P(P_ROWS IN NUMBER, P_SLEEP IN NUMBER)
RETURN T_TF_TAB PIPELINED
AS
BEGIN
FOR I IN 1..P_ROWS LOOP
DBMS_LOCK.SLEEP(P_SLEEP);
PIPE ROW(T_TF_ROW(I,'DESCRIPTION FOR ' || I));
END LOOP;
RETURN;
END;

正常 function 結果

流水線 function 結果

您的流水線 function 工作正常,但您的客戶端的提取大小優化是在返回任何內容之前一次檢索 N 行。 禁用或降低提取大小,您應該開始看到返回的各個行。 但是,在生產中,您不想禁用該優化。

在 SQL*Plus 中,您將運行以下命令以一次查看一行:

set arraysize 1;

(實際上一次返回行,原因我不記得了。有一種解決方法,但除非您正在編寫某種進度條程序,否則您可能並不關心獲得准確的一行-時間。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM