(转)pipe row的用法, Oracle split 函数写法.
本文轉(zhuǎn)載自:http://www.cnblogs.com/newsea/archive/2010/12/14/1905482.html
關(guān)于 pipe row的用法2009/12/30 14:53
=========================================================== 作者: flysky0814(http://flysky0814.itpub.net)發(fā)表于:2007.11.28 11:14
分類: oracle10g?
出處:http://flysky0814.itpub.net/post/35477/419443
--------------------------------------------------------------- 為了讓 PL/SQL 函數(shù)返回數(shù)據(jù)的多個行,必須通過返回一個 REF CURSOR 或一個數(shù)據(jù)集合來完成。REF CURSOR 的這種情況局限于可以從查詢中選擇的數(shù)據(jù),而整個集合在可以返回前,必須進(jìn)行具體化。Oracle 9i 通過引入的管道化表函數(shù)糾正了后一種情況。表函數(shù)是返回整個行的集(通常作為一個集合)的函數(shù),可以直接從 SQL 語句中進(jìn)行查詢,就好像它是一個真正的數(shù)據(jù)庫表一樣。管道化表函數(shù)與之相似,但是它像在構(gòu)建時一樣返回數(shù)據(jù),而不是一次全部返回。管道化表函數(shù)更加有效,因為數(shù)據(jù)可以盡可能快地返回。
?
管道化表函數(shù)必須返回一個集合。在函數(shù)中,PIPE ROW 語句被用來返回該集合的單個元素,該函數(shù)必須以一個空的 RETURN 語句結(jié)束,以表明它已經(jīng)完成。一旦我們創(chuàng)建了上述函數(shù),我們就可以使用 TABLE 操作符從 SQL 查詢中調(diào)用它。
管道化表函數(shù)經(jīng)常被用來把數(shù)據(jù)從一種類型轉(zhuǎn)化成另一種類型。
下面是用 Pipelined Table 實現(xiàn) split 函數(shù)的例子:
?
CREATE OR REPLACE TYPE ty_str_split IS TABLE OF VARCHAR2 (4000);
CREATE OR REPLACE FUNCTION fn_split (p_str IN VARCHAR2, p_delimiter IN VARCHAR2)
RETURN ty_str_split PIPELINED
IS
j INT := 0;
i INT := 1;
len INT := 0;
len1 INT := 0;
str VARCHAR2 (4000);
BEGIN
len := LENGTH (p_str);
len1 := LENGTH (p_delimiter);
WHILE j < len
LOOP
j := INSTR (p_str, p_delimiter, i);
IF j = 0
THEN
j := len;
str := SUBSTR (p_str, i);
PIPE ROW (str);
IF i >= len
THEN
EXIT;
END IF;
ELSE
str := SUBSTR (p_str, i, j - i);
i := j + len1;
PIPE ROW (str);
END IF;
END LOOP;
RETURN;
END fn_split;
/
測試:SELECT * FROM TABLE (fn_split ('1;;12;;123;;1234;;12345', ';;'));
結(jié)果:
1
12
123
1234
12345?
又一個簡單的例子:CREATE TYPE mytype AS OBJECT (
field1 NUMBER,
field2 VARCHAR2 (50)
);
CREATE TYPE mytypelist AS TABLE OF mytype;
CREATE OR REPLACE FUNCTION pipelineme
RETURN mytypelist PIPELINEDIS
v_mytype mytype;
BEGIN
FOR v_count IN 1 .. 20
LOOP
v_mytype := mytype (v_count, 'Row ' || v_count);
PIPE ROW (v_mytype);?END LOOP;
RETURN;
END pipelineme;
SELECT * FROM TABLE (pipelineme);
FIELD1 FIELD2?
------ ------------------------
1 Row 1
2 Row 2
3 Row 3
4 Row 4
5 Row 5
6 Row 6
7 Row 7
8 Row 8
9 Row 9
10 Row 10
11 Row 11
12 Row 12
13 Row 13
14 Row 14
15 Row 15
16 Row 16
17 Row 17
18 Row 18
19 Row 19
20 Row 20
create or replace type dlsys.split_tbl as table of varchar2(32767);
create or replace function dlsys.dlsplit(p_list varchar2,
???????????????????????????????????????? p_del varchar2 := ',')
return dlsys.split_tbl
pipelined is
l_idx pls_integer;
l_list varchar2(32767) := p_list;
begin
loop
??? l_idx := instr(l_list, p_del);
??? if l_idx > 0 then
????? pipe row(substr(l_list, 1, l_idx - 1));
????? l_list := substr(l_list, l_idx + length(p_del));
??? else
????? pipe row(l_list);
????? exit;
??? end if;
end loop;
return;
end dlsplit;
?
-----------------------------------------------------------------------------------------------
DECLARE
? a?? ty_str_split? ;
BEGIN
?? select?? fn_split ('1;;12;;123;;1234;;12345;;w', ';;') into a from dual ;
?? a(1) := 'ell';
?? dbms_output.put_line(a(100));
?? null;
END;
總結(jié)
以上是生活随笔為你收集整理的(转)pipe row的用法, Oracle split 函数写法.的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaScript onerror事件
- 下一篇: 动态行和列的表格,展现方式