例子:

一个字符串"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. 读取input:file的路径并显示本地图片的方法

    <!doctype html> <html> <head> <meta content="text/html; charset=UTF-8" ...

  2. Linq To Sqlite 一一二二

    说在前头 之所以写下这些文字,主要是因为使用LINQ的同志们都觉它的美好(至于有多美好,各位心里知道,我就不在描述了,如果你是你还不了解LINQ,园子里有大把的文章),微软老哥只提供了自家的SQLSe ...

  3. MFC通过ODBC方式连接mysql

    一. 要安装mysql-connector-odbc驱动 二. 配置数据源 电脑的控制面板-管理工具-数据源ODBC-系统DSN-添加-选择刚刚安装的mysql odbc Driver 参考 http ...

  4. xcode编译错误

    1.xcode无效文件的编译错误. 问题: clang: error: no such file or directory: '/Users/admin/client/trunk/sengoku_sc ...

  5. Java堆和栈详解

    Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间 ...

  6. Linq join on 多条件

    var a = from m in DbContext.Set<T1>() join q in DbContext.Set<T2>() on new { m.ID, Phone ...

  7. 十五、JDBC操作数据库

    1.数据库特点 实现数据共享.减少数据的冗余度.数据的独立性.数据集中控制.数据的一致性和可维护性. 2.数据库种类和功能 (1)层次型数据库:类似于树结构,是一组通过链接而互相联系在一起的记录. ( ...

  8. 用JavaBean实现数据库的连接和关闭,在jsp页面输出数据库中student表中学生的信息

    package com.hanqi.test; import java.sql.*; public class XveSheng { Connection conn; Statement st; Re ...

  9. Cheatsheet: 2016 02.01 ~ 02.29

    Web How to do distributed locking Writing Next Generation Reusable JavaScript Modules in ECMAScript ...

  10. Windows计划任务执行时不显示窗口的问题

    最近开发了工具,带界面的,需要定时执行的,为了方便直接用Windows计划任务做定时了.跑了一段时间发现,进程中也有,就是看不到程序的界面,进程的执行貌似也阻塞了. 从网上查了下,发现时启动方式的问题 ...