日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

pipe row的用法, Oracle split 函数写法.

發布時間:2024/9/20 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 函数写法.的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。