oracle进行字符串拆分并组成数组
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进行字符串拆分并组成数组的更多相关文章
- 信1705-2 软工作业最大重复词查询思路: (1)将文章(一个字符串存储)按空格进行拆分(split)后,存储到一个字符串(单词)数组中。 (2)定义一个Map,key是字符串类型,保存单词;value是数字类型,保存该单词出现的次数。 (3)遍历(1)中得到的字符串数组,对于每一个单词,考察Map的key中是否出现过该单词,如果没出现过,map中增加一个元素,key为该单词,value为1(
通过学习学会了文本的访问,了解一点哈希表用途.经过网上查找做成了下面查询文章重复词的JAVA程序. 1 思 思路: (1)将文章(一个字符串存储)按空格进行拆分(split)后,存储到一个字符串(单词 ...
- php将长字符串拆分为指定最大宽度的字符串数组
/** * 将字符串拆分为指定最大宽度的字符串数组.单字节字符宽度为1,多字节字符通常宽度为2 * @param string $msg 要拆分的字符串 * @param int $width 结果数 ...
- 2016/4/5 Ajax ①用户名 密码 登陆 注册 ② 判断用户名是否已存在 ③点击按钮出现民族选项下拉菜单 ④DBDA类 加入Ajaxquery方法 数组变字符串 字符串拆分
①登陆 注册 查表匹配 0405Ajax.php ②判断用户名是否存在 <!DOCTYPE html> <html lang="en"> ...
- Swift - 将字符串拆分成数组(把一个字符串分割成字符串数组)
在Swift中,如果需要把一个字符串根据特定的分隔符拆分(split)成字符串数组,通常有如下两种方法: 1,使用componentsSeparatedByString()方法 1 2 3 4 5 l ...
- java 将字符串拆分成块装数组
split 将字符串拆分 regex=???,根据???以其为界进行拆分. public String[] split(String regex) 根据给定正则表达式的匹配拆分此字符串. 该方法的作用 ...
- Java将一段逗号分割的字符串转换成一个数组
String 类:String 类代表字符串.Java 程序中的所有字符串字面值都作为此类的实例实现.字符串是常量,它们的值在创建之后不能更改.字符串缓冲区支持可变的字符串.因为 String 对象是 ...
- 页面循环绑定(变量污染问题),js面向对象编程(对象属性增删改查),js字符串操作,js数组操作
页面循环绑定(变量污染问题) var lis = document.querySelectorAll(".ul li") for ( var i = 0 ; i < lis. ...
- Java字符串拆分和字符串连接
Java字符串拆分/连接 public class LierString{ //------------------------------------------------------------ ...
- Clickhouse 字符串拆分 OR 一行转多行
Clickhouse 字符串拆分 OR 一行转多行 我想把 '123_456_142354_23543' 通过'_' 下划线进行拆分成
随机推荐
- camera按键采集图像及waitKey的用法
前言 项目需要通过摄像头采集图像并保存,主要是用于后续的摄像头标定.实现过程其实很简单,需要注意一些细节. 系统环境 系统版本:ubuntu16.04:opencv版本:opencv2.4.13:编程 ...
- bzoj1660 / P2866 [USACO06NOV]糟糕的一天Bad Hair Day
P2866 [USACO06NOV]糟糕的一天Bad Hair Day 奶牛题里好多单调栈..... 维护一个单调递减栈,存每只牛的高度和位置,顺便统计一下答案. #include<iostre ...
- 20145321《网络对抗技术》逆向与Bof基础
20145321<网络对抗技术>逆向与Bof基础 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何 ...
- 删除string类型字符串中指定字符串段
1.实现背景 在插入list行时用邮件的MessageID给对应行命名. 在回复全部邮件时,收件人变为之前收件人中出去“自己”同时加入之前发件人,抄送人还是之前的抄送人,密送人不用管,直接不用带. 在 ...
- 字符编码之间的相互转换 UTF8与GBK(转载)
转载自http://www.cnblogs.com/azraelly/archive/2012/06/21/2558360.html UTF8与GBK字符编码之间的相互转换 C++ UTF8编码转换 ...
- Python3基础 list remove 删除元素
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- Django组件(四) Django之Auth模块
Auth模块概述 Auth模块是Django自带的用户认证模块: 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能 ...
- JavaScrpt简单介绍
什么是javaScrpt javascript因为兼容于ECMA标准,因此也称为ECMAScript.JavaScript作为一种脚本语言,已经被广泛地应用于Web页面当中,通过嵌入HTML来实现各种 ...
- RNN网络【转】
本文转载自:https://zhuanlan.zhihu.com/p/29212896 简单的Char RNN生成文本 Sherlock I want to create some new thing ...
- 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) ...