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. Linux学习笔记之Centos7安装GNOME桌面环境

    最小化安装Centos7,系统默认是命令行界面,如果像我一样有特殊需求,这时就需要我们手动来安装用户图形界面了. 1.查看一下当前的运行级别和可以安装的group. systemctl get-def ...

  2. Java ftp上传文件方法效率对比

    Java ftp上传文件方法效率对比 一.功能简介: txt文件采用ftp方式从windows传输到Linux系统: 二.ftp实现方法 (1)方法一:采用二进制流传输,设置缓冲区,速度快,50M的t ...

  3. Git基础 —— Github 的使用

    Git 基础学习系列 Git 基础 -- 安装 配置 别名 对象 Git 基础 -- 常用命令 Git 基础 -- 常见使用场景 Git基础 -- Github 的使用 Github 的利用 Gith ...

  4. win7系统远程桌面无法正常连接

    我的电脑--属性--远程设置:初步设置: 此外还需要确认服务是否开启

  5. [BZOJ1776][Usaco2010 Hol]cowpol 奶牛政坛

    Description 农夫约翰的奶牛住在N (2 <= N <= 200,000)片不同的草地上,标号为1到N.恰好有N-1条单位长度的双向道路,用各种各样的方法连接这些草地.而且从每片 ...

  6. basename、dirname、alias、date

    basename 此命令用于打印目录或者文件的基本名称. basename和dirname命令通常用于shell脚本中的命令替换来指定和指定的输入文件名称有所差异的输出文件名称. basename ( ...

  7. 【Python】【fmt】

      [练习]    #练习1:format print(format(3.44444,'.3e')) #3.444e+00 #练习2:findall() & finditer()import ...

  8. github+hexo搭建博客

    引言     之前用阿里云弹性web托管采用wordpress搭建的个人博客,经过我使用一段时间之后发现存在很多问题: 网站的响应速度非常慢,估计打开主页需要3-4s的时间,我经过搜索发现很多人都有这 ...

  9. MongoDB(课时14 正则运算)

    3.2.4.9 正则运算 如果想实现模糊查询,必须使用正则表达式,而且正则表达式使用的语言是Perl兼容的正则表达式的形式. 要实现正则使用,则按照如下的定义格式: 基础语法:{key : 正则标记} ...

  10. 用docker部署flask+gunicorn+nginx

    说来惭愧,写了好几个flask django项目都是在原型阶段直接python app.py 运行的,涉及到部署用nginx和gunicorn 都是让别人帮我部署的,据说好像说很麻烦的样子,我就没自己 ...