pipe row的用法, Oracle split 函数写法.
關于 pipe row的用法2009/12/30 14:53
=========================================================== 作者: flysky0814(http://flysky0814.itpub.net)
發表于:2007.11.28 11:14
分類: oracle10g
出處:http://flysky0814.itpub.net/post/35477/419443
--------------------------------------------------------------- 為了讓 PL/SQL 函數返回數據的多個行,必須通過返回一個 REF CURSOR 或一個數據集合來完成。REF CURSOR 的這種情況局限于可以從查詢中選擇的數據,而整個集合在可以返回前,必須進行具體化。Oracle 9i 通過引入的管道化表函數糾正了后一種情況。表函數是返回整個行的集(通常作為一個集合)的函數,可以直接從 SQL 語句中進行查詢,就好像它是一個真正的數據庫表一樣。管道化表函數與之相似,但是它像在構建時一樣返回數據,而不是一次全部返回。管道化表函數更加有效, 因為數據可以盡可能快地返回。
管道化表函數必須返回一個集合。在函數中,PIPE ROW 語句被用來返回該集合的單個元素,該函數必須以一個空的 RETURN 語句結束,以表明它已經完成。一旦我們創建了上述函數,我們就可以使用 TABLE 操作符從 SQL 查詢中調用它。
管道化表函數經常被用來把數據從一種類型轉化成另一種類型。
下面是用 Pipelined Table 實現 split 函數的例子:
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 PIPELINEDISj INT := 0;i INT := 1;len INT := 0;len1 INT := 0;str VARCHAR2 (4000);BEGINlen := LENGTH (p_str);len1 := LENGTH (p_delimiter);
WHILE j < lenLOOPj := INSTR (p_str, p_delimiter, i);
IF j = 0THENj := len;str := SUBSTR (p_str, i);PIPE ROW (str);
IF i >= lenTHENEXIT;END IF;ELSEstr := 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', ';;'));
結果:112123123412345 又一個簡單的例子:CREATE TYPE mytype AS OBJECT (field1 NUMBER,field2 VARCHAR2 (50));
CREATE TYPE mytypelist AS TABLE OF mytype;
CREATE OR REPLACE FUNCTION pipelinemeRETURN mytypelist PIPELINEDISv_mytype mytype;BEGINFOR v_count IN 1 .. 20LOOPv_mytype := mytype (v_count, 'Row ' || v_count);PIPE ROW (v_mytype); END LOOP;
RETURN;END pipelineme;SELECT * FROM TABLE (pipelineme);FIELD1 FIELD2 ------ ------------------------1 Row 12 Row 23 Row 34 Row 45 Row 56 Row 67 Row 78 Row 89 Row 910 Row 1011 Row 1112 Row 1213 Row 1314 Row 1415 Row 1516 Row 1617 Row 1718 Row 1819 Row 1920 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;
總結
以上是生活随笔為你收集整理的pipe row的用法, Oracle split 函数写法.的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大樱桃的营养价值表(大樱桃的营养价值)
- 下一篇: 当归苦参丸(说一说当归苦参丸的简介)