您的位置:首页 > 其它

它将被转换到一个函数来显示数据行以逗号分隔的数据列在一排

2015-12-02 19:05 281 查看
<pre name="code" class="sql">这是使用字符串切割功能的一例
select to_number(strvalue) as Value from table(fn_split('1,2,3',','))
select to_char(strvalue) as Value from table(fn_split('aa,bb,cc',','))
</pre><pre name="code" class="sql">函数:


</pre><pre name="code" class="sql">CREATE OR REPLACE FUNCTION ROOT.fn_split(
p_str       IN VARCHAR2,
p_delimiter IN VARCHAR2)
RETURN ty_tbl_str_split IS
j         INT := 0;
i         INT := 1;
-- 被切割的源字符串 的长度.
len       INT := 0;
-- 分隔字符串的长度
len1      INT := 0;
-- 暂存的中间每个单元的文本信息.
str       VARCHAR2(4000);
-- 预期返回结果.
str_split ty_tbl_str_split := ty_tbl_str_split();
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=0 意味着没有找到.
-- 能够理解为是查询到最后一个单元了.
-- 设置 j := len, 让外部的循环处理能够结束了.
j  := len;
-- 获取最后一个单元的内容.
str := SUBSTR(p_str, i);
-- 结果追加一行.
str_split.EXTEND;
-- 设置结果内容.
str_split(str_split.COUNT) := ty_row_str_split(strValue => str);

IF i >= len THEN
EXIT;
END IF;
ELSE
-- 假设在被切割的源字符串中。找到了 分隔字符串.
-- 首先。获取切割的内容.
str := SUBSTR(p_str, i, j - i);
-- 然后设置索引。 下一次再查找的时候。从指定的索引位置開始(不是从0開始找了)
i := j + len1;
-- 结果追加一好.
str_split.EXTEND;
-- 结果集内容.
str_split(str_split.COUNT) := ty_row_str_split(strValue => str);
END IF;
END LOOP;

RETURN str_split;
END fn_split;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: