管道化表函式PIPELINED

2021-08-26 17:43:36 字數 2627 閱讀 7219

為了讓 pl/sql 函式返回資料的多個行,必須通過返回乙個 ref cursor 或乙個資料集合來完成。ref cursor 的這種情況侷限於可以從查詢中選擇的資料,而整個集合在可以返回前,必須進行具體化。oracle 9i 通過引入的管道化表函式糾正了後一種情況。表函式是返回整個行的集(通常作為乙個集合)的函式,可以直接從 sql 語句中進行查詢,就好像它是乙個真正的資料庫表一樣。管道化表函式與之相似,但是它像在構建時一樣返回資料,而不是一次全部返回。管道化表函式更加有效,因為資料可以盡可能快地返回。

管道化表函式必須返回乙個集合。在函式中,pipe row 語句被用來返回該集合的單個元素,該函式必須以乙個空的 return 語句結束,以表明它已經完成。一旦我們建立了上述函式,我們就可以使用 table 操作符從 sql 查詢中呼叫它。

管道化表函式經常被用來把資料從一種型別轉化成另一種型別。

例子1:

--需要預先定義str_split型別

create or replace type str_split is table of varchar2 (4000)

--管道化表函式

create or replace function fn_split(p_str       in varchar2,

p_delimiter in varchar2)

return str_split

pipelined is

/*測試:select * from table (fn_split('aa,abb,123abc,12345678', ','));

結果:aa

abb123abc

12345678

*/pvar_j          int := 0;

pvar_i          int := 1;

pvar_i_lenstr   int := 0;   --字串長度

pvar_i_lensmark int := 0;   --分隔符的長度

str             varchar2(4000);

begin

pvar_i_lenstr   := length(p_str);

pvar_i_lensmark := length(p_delimiter);

while pvar_j < pvar_i_lenstr loop

pvar_j := instr(p_str, p_delimiter, pvar_i);

if pvar_j = 0 then

pvar_j := pvar_i_lenstr;

str    := substr(p_str, pvar_i);

pipe row(str);

if pvar_i >= pvar_i_lenstr then

exit;

end if;

else

str    := substr(p_str, pvar_i, pvar_j - pvar_i);

pvar_i := pvar_j + pvar_i_lensmark;

pipe row(str);

end if;

end loop;

return;

end fn_split;

例子2:

declare 

tm_i integer;

begin

select count(*) into tm_i from user_objects t where lower(t.object_name) = lower('mytype') and lower(t.object_type) = lower('type');

if tm_i = 0 then

execute immediate 

'create  or replace type mytype as object

(field1 number,

field2 varchar2(50)

)';else

execute immediate ' drop type mytype force ';

execute immediate 

'create  or replace type mytype as object

(field1 number,

field2 varchar2(50)

)';end if;

end;

/create  or replace type mytypelist as table of mytype;

create or replace function pipelineme

return mytypelist

pipelined is

v_mytype mytype;

begin

for v_count in 1 .. 10 loop

v_mytype := mytype(v_count, 'row ' || v_count);

pipe row(v_mytype);

end loop;

return;

end pipelineme;

測試:select * from table (pipelineme);

結果:

出處:

ORACLE管道化表函式

在pl sql中,如果要返回資料的多個行,必須通過返回乙個ref cursor的游標,或者乙個資料集合 如臨時表或物理表 來完成,而ref cursor的侷限於可以從查詢中選擇的資料,而資料集合的侷限性在於必須先create table 無論是建立臨時表還是物理表 來進行具體化,具體化後,會因為頻繁...

Oracle 管道化表函式

在pl sql中,如果要返回資料的多個行,必須通過返回乙個ref cursor的游標,或者乙個資料集合 如臨時表或物理表 來完成,而ref cursor的侷限於可以從查詢中選擇的資料,而資料集合的侷限性在於必須先create table 無論是建立臨時表還是物理表 來進行具體化,具體化後,會因為頻繁...

Linux管道函式使用

背景 專案有個功能是檢視版本號 像什麼核心版本號 驅動版本號,等等 是通過管道來實現的,網上也有這方面的介紹,就不多說了。在一次測試過程中,發現不斷檢視版本號竟然會導致系統復位 比如檢視20次 40次 100次 這個bug發現晚的原因是沒有誰那麼無聊連續檢視100次版本號,當然,發現也是碰巧在幾次檢...