Oracle PL / SQL按新行拆分

时间:2017-05-01 17:19:25

标签: oracle plsql

如何按新行或其他字符拆分字符串 字符串

ABC|123
xyz|098

ABC --- 123
xyz --- 098

2 个答案:

答案 0 :(得分:1)

尝试使用regexp_substr功能...

select regexp_substr('ABC|123','[^|]+',1,1) part1, regexp_substr('ABC|123','[^|]+',1,2) part2 from dual

如果新行CR/LF),它将如下所示:

   `regexp_substr(mystr,'[^('||chr(13)||chr(10)||')]+',1,1) part1,
    regexp_substr(mystr,'[^('||chr(13)||chr(10)||')]+',1,2) part2`

答案 1 :(得分:0)

创建oracle split函数,返回varray。这里V_ARRAY是类型

  1. 创建TYPE V_ARRAY
  2. 之后创建返回split
  3. V_ARRAY函数
    CREATE OR REPLACE TYPE V_ARRAY AS VARRAY(1000) OF VARCHAR2(4000);
    
    CREATE or REPLACE function split(str varchar2, patt varchar2)
    RETURN v_array as
      s BINARY_integer;
      e BINARY_integer;
      i BINARY_integer;
      token v_array;
    begin
      token := v_array();
      i :=1;
      s := 0;
      e := INSTR(str, patt);
      while(e > 0) loop
          token.extend; // add new varchar2
          token(i) := substr(str, s+1, e-s-1);
          s := e;
          e := INSTR(str, patt, s+1);
          i := i + 1;
      end loop;
      token.extend;
      token(i) := substr(str, s+1, length(str) -1);
      return token;
    end;
    

    实施例

    declare
      str  varchar(10000);
      line varchar(10000);
      lines v_array;
      subs v_array;
    begin
      str := 'ABCe123';--|| chr(10) ||'xyz|098';
      lines := split(str, chr(10));
      --DBMS_OUTPUT.PUT_LINE(lines.count);
      for i in 1.. lines.count loop
        line := lines(i);  
       -- DBMS_OUTPUT.PUT_LINE( 'line :' ||  line);
        subs := split(line, '|');
       -- DBMS_OUTPUT.PUT_LINE(subs.count);
        DBMS_OUTPUT.PUT_LINE( subs(1) || '---' || subs(1) );
      end loop;      
    end;
    

    参考:A function to splitloop through