ORACLE字符拆分函數,返回結果集

ORACLE不能像MSSQL那樣支持直接返回表類型,所以要先創建一種自定義類型。這裏用到的是嵌套表(Nested Table)。

-- Nested Table
CREATE OR REPLACE TYPE split_str IS TABLE OF VARCHAR(100);
/

-- Function
CREATE OR REPLACE FUNCTION fn_Split
(
    p_Str VARCHAR2,
    p_Delimiter VARCHAR2
)
RETURN split_str PIPELINED
AS
    v_Str VARCHAR(4000) := p_Str;
    v_Index NUMBER;
    v_SubLength NUMBER;
BEGIN
    -- p_Delimiter is null
    IF p_Delimiter IS NULL THEN
        FOR x IN 1..LENGTH(v_Str)
        LOOP
            PIPE ROW(SUBSTR(V_Str,x,1));
        END LOOP;
        RETURN;
    END IF;

    v_index := INSTR(v_Str,p_Delimiter);
    WHILE v_Index <> 0
    LOOP
        PIPE ROW(SUBSTR(v_Str,1,v_Index-1));
        v_SubLength := LENGTH(v_Str) - (v_index + LENGTH(p_Delimiter) - 1);
        v_Str := SUBSTR(v_Str,-v_SubLength,v_SubLength);
        v_index := INSTR(v_Str,p_Delimiter);
    END LOOP;
    PIPE ROW(v_Str);
    RETURN;
END;
/

-- 調用(第二種方式更好)
SELECT fn_split('[email protected]@[email protected]@it','@@') FROM dual;
SELECT * FROM Table(fn_split('[email protected]@[email protected]@it','@@'));

From: 無明之師

ORACLE字符拆分函數,返回結果集,布布扣,bubuko.com

时间: 2024-12-28 20:27:09

ORACLE字符拆分函數,返回結果集的相关文章

DB2常用函數總結

最近用DB2,数据库之间的差异还是很大的,好多函数都不一样 1.去空格 *DB2中:Ltrim()是去左边空格,rtrim()是去右边空格.*informix中:trim()就是去空格.用法:例:string a="  abc  ";     *DB2中:Ltrim(a)="abc  ";rtrim(a)="  abc",rtrim(ltrim(a))="abc";     *informix中:trim(a)="a

函數返回值是引用类型,此函数当左值、右值

函数返回值是引用,返回的是变量本身,即变量的内存. 这个变量必须是静态的或全局的,防止函数之外内存消亡. #include <iostream> using namespace std; int func() { int a=10; a++; return a; } int& func1()//函数返回值是引用,返回的是变量本身,即变量的内存 { static int a=10;//静态变量或者全局变量 a++; return a; } int main() { int x,y; x=

學習日記:函數和對象

2016-2-21 1. Living without an aim is like sailing without a compass. 生活沒有目標,猶如航海沒有羅盤. 2. 無論是現實世界還是計算機世界,可讀性都是相當重要的,因為這涉及到人們的意識或者是認識效率,一般文字比數字的可理解性和可讀性要好,圖片的可讀性最強. a) 一般數學是比較抽象的,因為其中充滿著各種阿拉伯數字和已經不能再簡化的希臘字符. b) 數學家的得意之作就是覺得自己是在世界科學界的最巔峰. c) 我們能用數學工具處理

OpenERP函數字段的應用

在ERP開發過程中經常會使用到某字段的值是由其他字段計算得來,並且有些還需要將計算的結果存入資料庫. 以上功能上OpenERP中是用field.function實現的 其中有種模式 a). 只計算,不存儲 這種方式比較簡單,只需要設定用來計算值的函數即可,函數分類method和function,method是指當前對象的方法,function是指一般的python函數,有特定簽名的函數 [python] view plaincopy 'amount': fields.function(_amt,

Python 函數與常用模組 - 迭代器

迭代器 我們已經知道可以直接作用於 for 循環的數據類型有以下幾種: 一類是集合數據類型: list . tuple . dict . set . str . bytes 等. 另一類是 generator ,包括生成器和帶 yield 的 generator function. 這些可以直接作用於 for 循環的對象,統稱為可迭代的對象( Iterable ): 可迭代的對象,可以把它想成就是 可以循環的對象, 可迭代 = 可循環 可以使用 isinstance() 判斷一個對象是否為 It

Python 函數與常用模組 - 生成器並行運算

目前我們已經大致上都了解生成器了,但要怎麼實際應用呢?!接下來就要舉個例子 yield 保存了這個函數的中斷狀態,返回當前這個狀態的值,並且把函數停在這,想什麼時候回來執行就什麼時候回來執行. 通過yield實現單綫程的情況下,實現並發運算的效果 #!/usr/bin/env python3 # -*- coding:utf-8 -*- def consumer(name): print("%s 準備吃包子啦!" %name) while True: baozi = yield # b

SQL窗口函數一例

需求: MSSQL,列出服務實例中所有數據庫的如下信息: 數據庫ID.數據庫名.創建日期.數據文件類型.數據文件大小.數據庫總大小.文件所在路徑. 寫法(後面的百分比為所花時間占比): -- 连接子查询 (47%) WITH cte_TotalSize AS ( SELECT database_id ,CAST(SUM(size) AS FLOAT)/128 AS [TotalSize(MB)] FROM sys.master_files GROUP BY database_id ) SELEC

SQL窗体函數一例

需求: MSSQL,列出服務實例中全部數據庫的例如以下信息: 數據庫ID.數據庫名.創建日期.數據文件類型.數據文件大小.數據庫總大小.文件所在路徑. 寫法(後面的百分比為所花時間占比): -- 连接子查询 (47%) WITH cte_TotalSize AS ( SELECT database_id ,CAST(SUM(size) AS FLOAT)/128 AS [TotalSize(MB)] FROM sys.master_files GROUP BY database_id ) SEL

Math.Round函數

Math.Round這個函數的解釋是將值按指定的小數位數舍入,但並不就是四捨五入.這種舍入有時稱為就近舍入或四舍六入五成雙 其實在 VB, VBScript, C#, J#, T-SQL 中 Round 函數都是採用 Banker's rounding(銀行家舍入)演算法,即四舍六入五取偶.事實上這也是 IEEE 規定的舍入標準.因此所有符合 IEEE 標準的語言都應該是採用這一演算法的. 如果大家想要四舍五入,記得要加上參數MidpointRounding.AwayFromZero decim