当前位置: 代码迷 >> Oracle管理 >> Oracle 函数,如果不用管道函数你会如何做
  详细解决方案

Oracle 函数,如果不用管道函数你会如何做

热度:142   发布时间:2016-04-24 04:18:37.0
Oracle 函数,如果不用管道函数你会怎么做?

编写一个函数,将具有某个特殊分隔符的字符串转成数组:
如字符串 UASD1M,123,1882,IID 
根据分割符 ,  分别将 UASD1M   123  1882  IID 存入数组中 



管道函数的做法:
1、创建type用于存储函数返回值
create or replace type type_split as table of varchar2(4000); 
2、Function代码(管道函数)
create or replace function test_split(p_list VARCHAR2, p_sep VARCHAR2) return type_split 
  PIPELINED IS
  l_idx  PLS_INTEGER;
  v_list VARCHAR2(32767) := p_list;
begin
  LOOP
    l_idx := instr(v_list, p_sep);
    IF l_idx > 0 THEN
      PIPE ROW(substr(v_list, 1, l_idx - 1));
      v_list := substr(v_list, l_idx + length(p_sep));
    ELSE
      PIPE ROW(v_list);
      EXIT;
    END IF;
  END LOOP;
  RETURN;
end test_split;
3、函数调用及结果查看
SELECT * FROM table(test_split('aaa,bbb,ccc',',')) ;
如果不用上面的这中做法,你能做出来吗?
------解决方案--------------------
方法太多了吧,xmltable, connect_by等都可以
------解决方案--------------------
引用:
帮忙写一个出来,用ORACLE写 

核心代码,如:

WITH T AS
 (SELECT 'UASD1M,123,1882,IID' C1 FROM DUAL)
select REGEXP_SUBSTR(C1, '[^,]+', 1, LEVEL) STR
  from T
CONNECT BY LEVEL <= REGEXP_COUNT(C1, ',') + 1
       and rowid = prior rowid
       and prior dbms_random.value is not null;

------解决方案--------------------
引用:
帮忙写一个出来,用ORACLE写 



select REGEXP_SUBSTR('UASD1M,123,1882,IID', '[^,]+', 1, LEVEL) STR
  from dual
CONNECT BY LEVEL <= REGEXP_COUNT('UASD1M,123,1882,IID', ',') + 1
       and prior dbms_random.value is not null;
  相关解决方案