레이블이 split 함수인 게시물을 표시합니다. 모든 게시물 표시
레이블이 split 함수인 게시물을 표시합니다. 모든 게시물 표시

2012-10-06

DBMS/오라클] Oracle에서_Split_생성해서_사용




출처 : http://mukeabi.egloos.com/2342599



우선 Table 타입을 선언합니다.

create or replace type split_tbl as table of varchar2(32767);
/

함수를 선언합니다.

create or replace function split
(
  p_list varchar2,
  p_del varchar2
) return split_tbl pipelined
is
  l_idx    pls_integer;
  l_list    varchar2(32767) := p_list;
  l_value    varchar2(32767);
begin
  loop
       l_idx := instr(l_list,p_del);
       if l_idx > 0 then
           pipe row(substr(l_list,1,l_idx-1));
           l_list := substr(l_list,l_idx+length(p_del));
       else
           pipe row(l_list);
           exit;
       end if;
  end loop;
  return;
end split;
/

사용법은

select * from table(split('1 2 3 4 5 6 7 8 9 10', ' '));

입니다.

출처: http://www.dulihana.com/blog/126

DBMS/오라클]Oracle에서_Split_-_쿼리로_만들기



출처 : http://syronia.tistory.com/entry/%EC%98%A4%EB%9D%BC%ED%81%B4-Split-%EA%B8%B0%EB%8A%A5-%EA%B5%AC%ED%98%84%ED%95%9C-Query




오라클 FUNCTION기능을 이용하는 방법도 있지만 쿼리로 구현해보았다.

구분자가 |일 경우 ------------------------

SELECT substr(wdata,
                      instr(wdata, '|', 1, LEVEL) + 1,
                      instr(wdata, '|', 1, LEVEL + 1) - instr(wdata, '|', 1, LEVEL) - 1) name
FROM (
           SELECT '|' || 'Kim|Lee|Park' || '|' wdata
           FROM DUAL
          )
CONNECT BY LEVEL <= length(wdata) - length(REPLACE(wdata, '|')) - 1


만약 구분자가 2개라면 ---------------

SELECT substr(wdata,
                      instr(wdata, '||', 1, LEVEL) + 2,
                      instr(wdata, '||', 1, LEVEL + 1) - instr(wdata, '||', 1, LEVEL) - 2) id
FROM (
           SELECT '||' || 'babo||kim||hello||home' || '||' wdata
           FROM dual
          )
CONNECT BY LEVEL <= (length(wdata) - length(REPLACE(wdata, '||')))/2 - 1

2012-09-16

DBMS/오라클]Oracle에서 Split 생성해서 사용





우선 Table 타입을 선언합니다.

create or replace type split_tbl as table of varchar2(32767);
/

함수를 선언합니다.

create or replace function split
(
  p_list varchar2,
  p_del varchar2
) return split_tbl pipelined
is
  l_idx    pls_integer;
  l_list    varchar2(32767) := p_list;
  l_value    varchar2(32767);
begin
  loop
       l_idx := instr(l_list,p_del);
       if l_idx > 0 then
           pipe row(substr(l_list,1,l_idx-1));
           l_list := substr(l_list,l_idx+length(p_del));
       else
           pipe row(l_list);
           exit;
       end if;
  end loop;
  return;
end split;
/

사용법은

select * from table(split('1 2 3 4 5 6 7 8 9 10', ' '));

입니다.

출처: http://www.dulihana.com/blog/126