国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

用Pipelined Table實現split函數的示例

2024-07-21 02:43:43
字體:
來源:轉載
供稿:網友
在實際的應用中,為了讓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 PIPELINEDIS    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', ';;'));結果:112123123412345又一個簡單的例子: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 2020 rows selected

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 乌审旗| 莱州市| 邓州市| 唐河县| 昌吉市| 台湾省| 阜南县| 蒲江县| 灌南县| 区。| 内江市| 稷山县| 宽甸| 铜川市| 北碚区| 景德镇市| 廉江市| 清远市| 鲜城| 枣阳市| 芮城县| 大余县| 加查县| 固安县| 文登市| 清原| 庄浪县| 屏东县| 汉阴县| 防城港市| 津南区| 嵊泗县| 临安市| 东港市| 黎城县| 扬中市| 安庆市| 清徐县| 临沭县| 扬中市| 津市市|