+ -
当前位置:首页 → 问答吧 → oracle 自定义函数(将有效数字字符串排序后返回)

oracle 自定义函数(将有效数字字符串排序后返回)

时间:2011-12-01

来源:互联网

如题,在oracle中,怎样将一组有效的数字字符串,例如(3,5,4,1),将它排序后返回1,3,4,5,请各位帮帮忙啊!很着急,‘
小妹不甚感激!

作者: pingsuccess   发布时间: 2011-12-01

传入的是字符串,返回也是字符串?
具体代码不写了,给你一个思路
1.将传入的字符串转换成数字(使用,to_number()函数)
2.然后将数字拆分成一个个独立的数字,存入数组中
3.进行排序(很多排序算法)
4.将排好序的数字从数组中取出,连接成字符串,返回。

作者: LuiseRADL   发布时间: 2011-12-01

引用 1 楼 luiseradl 的回复:
传入的是字符串,返回也是字符串?
具体代码不写了,给你一个思路
1.将传入的字符串转换成数字(使用,to_number()函数)
2.然后将数字拆分成一个个独立的数字,存入数组中
3.进行排序(很多排序算法)
4.将排好序的数字从数组中取出,连接成字符串,返回。


  是啊,传入的是有效数字的字符串(不确定几个数字,格式例如:3,5,4,1),然后返回1,3,4,5,

 能有具体的代码吗?没有写过这样的,不知道具体该怎么实现呢?因为我是oracle一个新手啊!!!

作者: pingsuccess   发布时间: 2011-12-01

引用楼主 pingsuccess 的回复:
如题,在oracle中,怎样将一组有效的数字字符串,例如(3,5,4,1),将它排序后返回1,3,4,5,请各位帮

可以新创建一张临时表tmp_table ,一个字段tmp_value,类型为number(4),在存储过程中,把传进来的3, 5, 4,1都insert 到临时表中,然后再将执行select * from tmp_table order by tmp_value后的结果输出出来就行了。。呵呵。

作者: yixilan   发布时间: 2011-12-01

帮你写了个转换用的函数,执行这个函数就可以转换了。函数内部使用了wm_concat方法,该方法需要oracle 10g以上版本。

SQL code

CREATE OR REPLACE FUNCTION f_PaiXu(OldStr VarChar2) RETURN VarChar2
AS
TmpStr VarChar2(4000);
NewStr VarChar2(4000);
WordCount Number(4);
BEGIN
  -- 如果参数为空,则返回空
  If OldStr Is Null Then
    RETURN Null;
  End If;
  
  -- 初始化待处理字符串
  TmpStr := OldStr||',';
  -- 计算字符串中有几个数字
  WordCount := LENGTH(TmpStr) - LENGTH(REPLACE(TmpStr,','));
  
  -- 将排序后的数字重新拼接成字符串
  SELECT WM_CONCAT(X)
  INTO NewStr
  FROM
      -- 将分解出来的数字排序
      (SELECT A.X 
      FROM
          -- 将字符串分解为数字(列转行) 
          (SELECT to_number(regexp_substr(TmpStr,'[0-9]+',1,LEVEL)) X  
           FROM DUAL 
           CONNECT BY LEVEL <= WordCount ) A
      ORDER BY A.X);
  RETURN NewStr;
END f_PaiXu;


作者: xiaobn_cn   发布时间: 2011-12-01

1. 创建type 类型表,存放数据
SQL code

CREATE OR REPLACE TYPE mytable AS TABLE OF varchar2(500);


2.创建函数
SQL code

CREATE OR REPLACE FUNCTION SEND_SPLIT(src VARCHAR2, delimiter varchar2)
  RETURN mytable IS
  psrc VARCHAR2(500);
  a    mytable := mytable();
  i    NUMBER := 1;
  j    NUMBER := 1;
BEGIN
  psrc := RTrim(LTrim(src, delimiter), delimiter);
  LOOP
    i := InStr(psrc, delimiter, j);
    --Dbms_Output.put_line(i);
    IF i > 0 THEN
      a.extend;
      a(a.Count) := Trim(SubStr(psrc, j, i - j));
      j := i + 1;
      --Dbms_Output.put_line(a(a.Count-1));
    END IF;
    EXIT WHEN i = 0;
  END LOOP;
  IF j <= Length(psrc) THEN
    a.extend;
    a(a.Count) := Trim(SubStr(psrc, j, Length(psrc) + 1 - j));
  END IF;
  RETURN a;
END;


3.输出测试
SQL code

select wm_concat(col) from (
SELECT column_value  as col FROM TABLE(CAST(SEND_SPLIT('1,9,5,6', ',')AS mytable)) order by column_value asc)

这个wm_concat ,oracle10g 才有

作者: programmerxiaocai   发布时间: 2011-12-01

SQL code

--不需要函数 写个sql就可以了。
----T1 代表你的字符串存储的表
----A 是字段

[TEST@myoracle] SQL>WITH T1 AS(
  2   SELECT '3,5,4,1' A FROM  dual UNION ALL
  3   SELECT '13,5,44,17' A FROM  dual UNION ALL
  4   SELECT '73,54,14,51' A FROM  dual UNION ALL
  5   SELECT '312,534,544,61' A FROM  dual
  6  )SELECT WM_CONCAT(ANS) ANS
  7    FROM (SELECT A, TO_NUMBER(REGEXP_SUBSTR(T1.A, '[^,]+', 1, L)) ANS
  8            FROM T1, (SELECT LEVEL L FROM DUAL CONNECT BY LEVEL <= 100) T2
  9           WHERE LENGTH(T1.A) - LENGTH(REPLACE(T1.A, ',', '')) >= L - 1
 10           ORDER BY A, ANS)
 11   GROUP BY A;

ANS
--------------------------------------------------------------------------------
5,13,17,44
1,3,4,5
61,534,544,312
14,54,73,51


作者: BenChiM888   发布时间: 2011-12-01