CREATE OR REPLACE TYPE CUX_STR_SPLIT_TYPE IS TABLE OF VARCHAR2 (4000);

CREATE OR REPLACE PACKAGE cux_char_handle_util_pkg IS

  TYPE char_var_type IS RECORD(
char_value VARCHAR2(200)); TYPE char_var_tbl IS TABLE OF char_var_type INDEX BY BINARY_INTEGER; g_char_var_tbl char_var_tbl; FUNCTION splitstr(p_string IN VARCHAR2, p_delimiter IN VARCHAR2)
RETURN cux_str_split_type
PIPELINED; PROCEDURE prepare_char_value(p_str_var VARCHAR2, p_delimiter IN VARCHAR2); FUNCTION make_char_str(p_str VARCHAR2, p_delimiter IN VARCHAR2)
RETURN VARCHAR2; END; /
CREATE OR REPLACE PACKAGE BODY cux_char_handle_util_pkg IS --拆分字符串
FUNCTION splitstr(p_string IN VARCHAR2, p_delimiter IN VARCHAR2)
RETURN cux_str_split_type
PIPELINED AS
v_length NUMBER := length(p_string);
v_start NUMBER := 1;
v_index NUMBER;
BEGIN
WHILE (v_start <= v_length) LOOP
v_index := instr(p_string, p_delimiter, v_start); IF v_index = 0 THEN
PIPE ROW(substr(p_string, v_start));
v_start := v_length + 1;
ELSE
PIPE ROW(substr(p_string, v_start, v_index - v_start));
v_start := v_index + 1;
END IF;
END LOOP; RETURN;
END; /******************************************************
\
\ 将字符串处理为全局数组变量g_char_var_tbl,
\
\
\
********************************************************/
PROCEDURE prepare_char_value(p_str_var VARCHAR2, p_delimiter IN VARCHAR2) IS CURSOR cur_cloumn(p_str VARCHAR2) IS
SELECT column_value FROM TABLE(splitstr(p_str, p_delimiter));
i NUMBER := 1; l_str_var VARCHAR2(240);
BEGIN l_str_var := p_str_var; g_char_var_tbl.delete;
OPEN cur_cloumn(l_str_var); LOOP
FETCH cur_cloumn
INTO g_char_var_tbl(i).char_value;
EXIT WHEN cur_cloumn%NOTFOUND;
i := i + 1;
END LOOP;
CLOSE cur_cloumn; END; /******************************************************
\在某些情况下,例如2.12.15.1, 2.2.1, 2.2.1.5, 2.20.1.1
\需要按每一段内的数字大小进行排序
\
\ 处理思路如下,将字符串按指定字符拆分到一个数组里面,并把每段左边补0补齐至2位(按需调整)
\ 将最后拼接的字符串向右补0,补齐至12位(按需调整,我本次的字符串不会超过6段)
\
   \ 对于类型为字符串或者汉字的仍然通用(由于汉字占三个字符,所以lpad的长度需要满足3*最大中文段长度),最后的排序结果为默认的oracle ansii排序,需要自己对中文再排序
   \
\ 最后在外层对返回的字符串进行排序即可
\
********************************************************/
FUNCTION make_char_str(p_str VARCHAR2, p_delimiter IN VARCHAR2)
RETURN VARCHAR2 IS v_str VARCHAR2(10); p_result_str VARCHAR2(50) := NULL; BEGIN --拆分字符串并拼接成数组,数组为全局变量g_char_var_tbl
prepare_char_value(p_str, p_delimiter); FOR i IN 1 .. g_char_var_tbl.count LOOP
--每段向左添加0补齐
v_str := lpad(g_char_var_tbl(i).char_value, 2, '');
--拼接
p_result_str := p_result_str || v_str;
END LOOP;
--将最后结果向右添加0补齐至12位
p_result_str := rpad(p_result_str, 12, ''); RETURN p_result_str;
END; END;

示例

 SELECT cux_char_handle_util_pkg.make_char_str(csa.account_code, '.'),
csa.head_id,
csa.*
FROM cux_cst_accounts csa
WHERE csa.head_id = 28
AND csa.account_code <> '根节点'
ORDER BY csa.account_code

加入

SELECT cux_char_handle_util_pkg.make_char_str(csa.account_code, '.'),
csa.head_id,
csa.*
FROM cux_cst_accounts csa
WHERE csa.head_id = 28
AND csa.account_code <> '根节点'
ORDER BY cux_char_handle_util_pkg.make_char_str(csa.account_code, '.');

oracle进行字符串拆分并组成数组的更多相关文章

  1. 信1705-2 软工作业最大重复词查询思路: (1)将文章(一个字符串存储)按空格进行拆分(split)后,存储到一个字符串(单词)数组中。 (2)定义一个Map,key是字符串类型,保存单词;value是数字类型,保存该单词出现的次数。 (3)遍历(1)中得到的字符串数组,对于每一个单词,考察Map的key中是否出现过该单词,如果没出现过,map中增加一个元素,key为该单词,value为1(

    通过学习学会了文本的访问,了解一点哈希表用途.经过网上查找做成了下面查询文章重复词的JAVA程序. 1 思 思路: (1)将文章(一个字符串存储)按空格进行拆分(split)后,存储到一个字符串(单词 ...

  2. php将长字符串拆分为指定最大宽度的字符串数组

    /** * 将字符串拆分为指定最大宽度的字符串数组.单字节字符宽度为1,多字节字符通常宽度为2 * @param string $msg 要拆分的字符串 * @param int $width 结果数 ...

  3. 2016/4/5 Ajax ①用户名 密码 登陆 注册 ② 判断用户名是否已存在 ③点击按钮出现民族选项下拉菜单 ④DBDA类 加入Ajaxquery方法 数组变字符串 字符串拆分

    ①登陆   注册    查表匹配    0405Ajax.php   ②判断用户名是否存在 <!DOCTYPE html> <html lang="en"> ...

  4. Swift - 将字符串拆分成数组(把一个字符串分割成字符串数组)

    在Swift中,如果需要把一个字符串根据特定的分隔符拆分(split)成字符串数组,通常有如下两种方法: 1,使用componentsSeparatedByString()方法 1 2 3 4 5 l ...

  5. java 将字符串拆分成块装数组

    split 将字符串拆分 regex=???,根据???以其为界进行拆分. public String[] split(String regex) 根据给定正则表达式的匹配拆分此字符串. 该方法的作用 ...

  6. Java将一段逗号分割的字符串转换成一个数组

    String 类:String 类代表字符串.Java 程序中的所有字符串字面值都作为此类的实例实现.字符串是常量,它们的值在创建之后不能更改.字符串缓冲区支持可变的字符串.因为 String 对象是 ...

  7. 页面循环绑定(变量污染问题),js面向对象编程(对象属性增删改查),js字符串操作,js数组操作

    页面循环绑定(变量污染问题) var lis = document.querySelectorAll(".ul li") for ( var i = 0 ; i < lis. ...

  8. Java字符串拆分和字符串连接

    Java字符串拆分/连接 public class LierString{ //------------------------------------------------------------ ...

  9. Clickhouse 字符串拆分 OR 一行转多行

    Clickhouse 字符串拆分 OR 一行转多行 我想把 '123_456_142354_23543' 通过'_' 下划线进行拆分成

随机推荐

  1. camera按键采集图像及waitKey的用法

    前言 项目需要通过摄像头采集图像并保存,主要是用于后续的摄像头标定.实现过程其实很简单,需要注意一些细节. 系统环境 系统版本:ubuntu16.04:opencv版本:opencv2.4.13:编程 ...

  2. bzoj1660 / P2866 [USACO06NOV]糟糕的一天Bad Hair Day

    P2866 [USACO06NOV]糟糕的一天Bad Hair Day 奶牛题里好多单调栈..... 维护一个单调递减栈,存每只牛的高度和位置,顺便统计一下答案. #include<iostre ...

  3. 20145321《网络对抗技术》逆向与Bof基础

    20145321<网络对抗技术>逆向与Bof基础 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何 ...

  4. 删除string类型字符串中指定字符串段

    1.实现背景 在插入list行时用邮件的MessageID给对应行命名. 在回复全部邮件时,收件人变为之前收件人中出去“自己”同时加入之前发件人,抄送人还是之前的抄送人,密送人不用管,直接不用带. 在 ...

  5. 字符编码之间的相互转换 UTF8与GBK(转载)

    转载自http://www.cnblogs.com/azraelly/archive/2012/06/21/2558360.html UTF8与GBK字符编码之间的相互转换 C++ UTF8编码转换 ...

  6. Python3基础 list remove 删除元素

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  7. Django组件(四) Django之Auth模块

    Auth模块概述 Auth模块是Django自带的用户认证模块: 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能 ...

  8. JavaScrpt简单介绍

    什么是javaScrpt javascript因为兼容于ECMA标准,因此也称为ECMAScript.JavaScript作为一种脚本语言,已经被广泛地应用于Web页面当中,通过嵌入HTML来实现各种 ...

  9. RNN网络【转】

    本文转载自:https://zhuanlan.zhihu.com/p/29212896 简单的Char RNN生成文本 Sherlock I want to create some new thing ...

  10. 51NOD 1046 A^B Mod C

    给出3个正整数A B C,求A^B Mod C. 例如,3 5 8,3^5 Mod 8 = 3. Input 3个正整数A B C,中间用空格分隔.(1 <= A,B,C <= 10^9) ...