ITPUB:求一段字符串截取的Pl/sql
2011-06-15 17:01 Tracy. 阅读(981) 评论(0) 收藏 举报求一段字符串截取的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’));
本文来自博客园,作者:Tracy.,转载请注明原文链接:https://www.cnblogs.com/tracy/archive/2011/06/15/2081646.html
                    
                
                
            
        
浙公网安备 33010602011771号