例子:

一个字符串"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. Objective-C Block

    OC中block的语法实在是太别扭了,不知道是不是我太孤陋寡闻了...在此记录一下,以供日后查找使用. 引用:http://goshdarnblocksyntax.com As a local var ...

  2. 简单Hosts使用说明

    1.查找hosts文件 首先,点击桌面的"我的电脑",或者是通过开始菜单进入到我的电脑. 之后,进入到"C:\Windows\System32\drivers\etc&q ...

  3. csuoj 1503: 点到圆弧的距离

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1503 1503: 点到圆弧的距离 时间限制: 1 Sec  内存限制: 128 MB  Speci ...

  4. 在RedHat/CentOS下安装Docker(不升级内核)

    由于内核版本问题,最初仅Ubuntu可以较好的支持Docker.不过,由于RedHat系列OS(REHL.CentOS)是目前主流的Linux服务器操作系统,所以令RedHat系列OS支持Docker ...

  5. mfc ui2

    引用:http://www.cnblogs.com/likwo/archive/2010/10/22/1858716.html CJLib(mfc扩展开发包,是xtreme toolkit的前生,但x ...

  6. 迭代器和for-of

    在ES5及之前的JS标准中,我们习惯了用for(var i = 0; i < Array.length;i++){//TODO}或者是for(var index in Array){consol ...

  7. android 消息机制

    一.Android应用程序的主线程主要用于更新UI界面,并且主线程不能做耗时操作,否则会引起ANR:这种情况下需要开一个子线程来进行耗时操作,动作完成之后,子线程发消息给主线程通知其更新UI显示,常见 ...

  8. Tomcat常见的内存溢出,以及解决方法

    一.常见的三种内存溢出错误: 1.java.lang.OutOfMemoryError:java heap space    ====JVM Heap(堆)溢出 JVM再启动的时候回自动设置JVM H ...

  9. 【Spring】初始化Spring IoC容器(非Web应用),并获取Bean

    参考文章 Introduction to the Spring IoC container and beans BeanFactory 和ApplicationContext(Bean工厂和应用上下文 ...

  10. 遗传算法在JobShop中的应用研究(part 2:编码)

    编码 在上一篇博客中我们讨论了车间调度问题的编码,具体说就是根据工件的个数和每个工件的工序数来生成12122这样的数字排列,具体的说一个工件包含多少道工序,那么这个工件的编号就出现多少次.从12122 ...