為了讓 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次版本號,當然,發現也是碰巧在幾次檢...