ITPUB:求一段字符串截取的Pl/sql

求一段字符串截取的Pl/sql

小弟做java开发的,对ORACLE pl/sql不甚了解,现项目中需要用一段函数,求各位大侠帮忙,感激不尽!
现有一 项目参与人的字段PROJECT_IN_PEOPLE 字符类型,里面存储的内容如下:
CP860040,SAL67,CP690041
存的是对应人员的ID号码,因为人员数量不确定,
有可能没有,
有可能一个或者多个,
现在页面上显示的也是ID号码,客户要求显示人名,
所以涉及到ORACLE字符串截取,然后去查用户表POR_USER的操作
如执行:
FUNCTION('CP860040,SAL67,CP690041')后,返回
张三,李四,王五
希望高人帮助,万分感谢!

------------------------Answer---------------------------------------------------------------

有问题吗?这个我写过很多遍的,项目中我也用过,而且还增加了很多复杂的表判断以及异常处理,异常你可以自己增加了
dingjun123@ORADB> CREATE OR REPLACE
2 FUNCTION convert_name_list( p_string IN VARCHAR2 ,p_delimiter IN VARCHAR2 default ',' )
3 RETURN VARCHAR2
4 AS
5 l_string LONG DEFAULT p_string || p_delimiter;
6 l_id POR_USER.ID%TYPE;
7 l_name POR_USER.NAME%TYPE;
8 l_result VARCHAR2(32767);
9 n NUMBER;
10 BEGIN
11 LOOP
12 EXIT WHEN l_string IS NULL;
13 n := instr( l_string, p_delimiter );
14
15 l_id :=
16 TRIM( substr( l_string, 1, n-1 ) );
17 SELECT NAME INTO l_name FROM POR_USER WHERE ID=l_id;
18 l_result := l_result||p_delimiter||l_name;
19 l_string := substr( l_string, n+1 );
20 END LOOP;
21 RETURN ltrim(l_result,p_delimiter);
22 END;
23 /
函数已创建。
已用时间: 00: 00: 01.03
dingjun123@ORADB> select * FROM POR_USER;
ID
----------------------------------------------------------------------------------------------------
NAME
----------------------------------------------------------------------------------------------------
CP860040
张三
SAL67
李四
CP690041
王五
已选择3行。
已用时间: 00: 00: 00.04
dingjun123@ORADB> select convert_name_list('CP860040,SAL67,CP690041') from dual;
CONVERT_NAME_LIST('CP860040,SAL67,CP690041')
----------------------------------------------------------------------------------------------------
张三,李四,王五
已选择 1 行。
已用时间: 00: 00: 00.01

------------------------------FYI----------------------------------------------------------------

行转列输出:

CREATE OR REPLACE function TMS.in_list( p_string in varchar2 ) return VARCHAR_TBL
    as
        l_string        long default p_string || ',';
        l_data          VARCHAR_TBL := VARCHAR_TBL();
        n               number;
   begin
      loop
          exit when l_string is null;
          n := instr( l_string, ',' );
         l_data.extend;
         l_data(l_data.count) :=
                 ltrim( rtrim( substr( l_string, 1, n-1 ) ) );
         l_string := substr( l_string, n+1 );
    end loop;

    return l_data;
  end;
/

SELECT COLUMN_VALUE dow FROM TABLE (in_list (‘MON,TUE,WED’));

原文地址:https://www.cnblogs.com/tracy/p/2081646.html