例子:

一个字符串"11,15,13,17,12",以逗号分割,现在要排序成"11,12,13,15,17"。

写了一个实现方法,记录下来以备后用:

--------------------------------------------------------
-- Export file for user BEN --
-- Created by Administrator on 2015/8/5 星期三, 10:24:20 --
-------------------------------------------------------- set define off
spool get_bubble.log prompt
prompt Creating function GET_BUBBLE
prompt ============================
prompt
create or replace function Get_BUBBLE
(
av_str varchar2, --要分割的字符串
av_split varchar2 --分隔符号 )
return varchar2
is
lv_str varchar2(1024);
str varchar2(1024);
str1 varchar2(1024); --进行交换的第一个子串
str2 varchar2(1024); --进行交换的第二个子串
temp varchar2(1024); --临时交换中间空间
new_str varchar2(1024); --内层循环每次交换的最大值
all_str varchar2(1024); --保存每次循环后生成的新串
end_str varchar2(1024); --最终值,返回值
lv_length number; --分割后的子串个数
jflag char(1); --每次外循环后首次内循环的标识
i number := 0; --外循环控制
j NUMBER := 0; --内循环控制
x number; --首次内循环第一个子串截取位置
k number; --首次内循环第二个子串截取位置
y number;
z number; --非首次内循环子串截取的位置
begin
lv_str := ltrim(rtrim(av_str)); --去前后空格
str := lv_str;
lv_length := 0;
----分割串【得到子串个数】
while instr(str,av_split)<>0 loop
lv_length:=lv_length+1;
str:=substr(str,instr(str,av_split)+length(av_split),length(str));
end loop;
lv_length:=lv_length+1;
if lv_length <= 1 then
return '分割后只有一个子串';
end if;
------------------------------------------------
end_str := '';
<<loop1>>
loop --外循环
if i < lv_length then
j := i+1;
jflag := 0;
new_str := '';
all_str := '';
<<loop2>>
loop --内循环
if j < lv_length then
if jflag = 0 then -- 首次内循环(方便处理子串的拼接问题)
select instr(lv_str, av_split, 1) into x from dual;
str1 := substr(lv_str, 1, x-1);
--decode处理最后一个子串截取位置为0的问题
select decode(instr(lv_str, av_split, x+length(av_split)),0,length(lv_str)+1,instr(lv_str, av_split, x+length(av_split))) into k from dual;
str2 := substr(lv_str, x+length(av_split), k-x-length(av_split));
select count(*) into y from dual where str1 > str2;
if y > 0 then
new_str := str1;
temp := str1;
str1 := str2;
str2 := temp;
else
new_str := str2;
end if;
all_str := str1;
jflag := 1;
else --非首次
str1 := new_str; --上次比较后的最大值作为这次比较的前一个值
select decode(instr(lv_str, av_split, k+length(av_split)),0,length(lv_str)+1,instr(lv_str, av_split, k+length(av_split))) into z from dual;
str2 := substr(lv_str, k+length(av_split), z-k-length(av_split)); --第二个
k := z; -- z赋给k,方便下一次截取str2
select count(*) into y from dual where str1 > str2;
if y > 0 then
new_str := str1;
temp := str1;
str1 := str2;
str2 := temp;
else
new_str := str2;
end if;
all_str := all_str||av_split||str1;
end if;
end if;
j := j+1;
exit loop2 when j >= lv_length; end loop loop2;
lv_str := all_str||av_split||new_str; --上一轮内循环生成的新串 if end_str is null then --最终的子串处理
end_str := new_str;
else
end_str := new_str||av_split||end_str;
end if; end if;
i := i+1;
exit when i >= lv_length-1;
end loop loop1;
end_str := str1||av_split||end_str; --返回前拼接上最后一个值 return end_str;
end Get_BUBBLE;
/ spool off

Oracle 字符串分割排序冒泡算法的更多相关文章

  1. 工作中用到的oracle字符串分割整理

    oracle部分: 定义类型(用于字符串分割): create or replace TYPE "STR_SPLIT" IS TABLE OF VARCHAR2 (4000); 字 ...

  2. Oracle字符串分割函数

    今天在创建视图的时候,碰到一个问题,问题如下: 将字符格式为“XXX,YYY”分割出来,并且分割后作为两个字段放入视图中. 考虑使用字符分割函数,但是查找资料Oracle没有字符分割的函数(我对Ora ...

  3. oracle 字符串分割

    ); create or replace function strsplit2(p_value varchar2, p_split varchar2 := ',') return str_split ...

  4. oracle 字符串分割函数

    首先创建一个类型: CREATE OR REPLACE TYPE str_split IS TABLE OF VARCHAR2 (4000); 创建函数: CREATE OR REPLACE FUNC ...

  5. Oracle字符串分割Split(超简单一条sql解决)

    ) FROM renyuan where name ='张三' 解决如下问题 我现在有一个字段是存:,,3的,而它对应另一张值集表中.eg; 课程人员表 renyuan id name Course ...

  6. Oracle拆分字符串,字符串分割的函数。

    第一种:oracle字符串分割和提取 分割 create or replace function Get_StrArrayLength ( av_str varchar2, --要分割的字符串 av_ ...

  7. Oracle 超长字符串分割劈分

    Oracle 超长字符串分割劈分,具体能有多长没测过,反正很大.... 下面,,,,直奔主题了: CREATE OR REPLACE FUNCTION splitstr(p_string IN clo ...

  8. 冒泡算法给0~9随机n位数字排序

    <?php //产生5位0~9的随机数      function getRand($begin=0,$end=9,$limit=5){                $rand_array=r ...

  9. python 数据结构与算法之排序(冒泡,选择,插入)

    目录 数据结构与算法之排序(冒泡,选择,插入) 为什么学习数据结构与算法: 数据结构与算法: 算法: 数据结构 冒泡排序法 选择排序法 插入排序法 数据结构与算法之排序(冒泡,选择,插入) 为什么学习 ...

随机推荐

  1. ThinkPHP讲解(十)——第三方类的引入:以分页为主

    第三方类的引入,以分页类为例: 1.在控制器里新建一个分页的操作方法FenYe() 注意:第三方类Page.class.php放在Think或Home文件夹下,并新近一个文件夹,放在里面,并在其类里加 ...

  2. Azure sdk for python

    http://www.oschina.net/translate/python-windows-azure Len  6:17:54 PM __author__ = 'len.li' from azu ...

  3. IOS手势UIGestureRecognizer

    UIGestureRecognizer是一个抽象类,定义了所有手势的基本行为,它有6个子类处理具体的手势: 1.UITapGestureRecognizer (任意手指任意次数的点击) // 点击次数 ...

  4. [转]Git调用第三方对比工具beyondCompare

    点击阅读原文 对于我这种 git 命令行小白来说, git 自带的对比工具各种水土不服,想念以前的 svn 小乌龟 + beyondCompare 的日子...纠结完 gitHub client 未果 ...

  5. PostgreSQL同步复制搭建

    摘要: PostgreSQL同步复制搭建 一.初始化master节点 1. 安装PostgreSQL 2. 初始化db initdb -D /data/pg940_data 二.配置master节点 ...

  6. Java 中System里getProperty(something)

    Java 中System里getProperty 方法获得系统参数 Key Description of Associated Value 中文描述 java.version Java Runtime ...

  7. android手电筒(摇一摇也可开启手电筒)

    package com.firefly.myflashlight; import android.app.Activity; import android.hardware.Camera; impor ...

  8. 2016年12月25日 星期日 --出埃及记 Exodus 21:20

    2016年12月25日 星期日 --出埃及记 Exodus 21:20 "If a man beats his male or female slave with a rod and the ...

  9. selenium操作浏览器cookie方法

    /**     * 操作浏览器的cookie     */        @Test    public void testCookie()throws Exception{        drive ...

  10. logstash安装与基础用法

    若是搭建elk,建议先安装好elasticsearch 来自官网,版本为2.3 wget -c https://download.elastic.co/logstash/logstash/packag ...