zoukankan      html  css  js  c++  java
  • 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’));

  • 相关阅读:
    机器学习漫游(1) 基本设定
    win10+anaconda+cuda配置dlib,使用GPU对dlib的深度学习算法进行加速(以人脸检测为例)
    基于SignalR的站点有连接数限制问题及解决方案
    如何删除EF4.0以上的版本
    从JDBC到hibernate再到mybatis之路
    ORA-01747: user.table.column, table.column 或列说明无效 异常解决方法总结
    MyBatis Oracle 批量新增、更新和删除
    IDEA 方法注释模板和类注释模板
    MyBatis 使用注解方式实现一对多
    (转)GPT磁盘与MBR磁盘区别
  • 原文地址:https://www.cnblogs.com/tracy/p/2081646.html
Copyright © 2011-2022 走看看