2017-11-08 4 views
1

현재 CLOB 인 단일 열 (COMMENTS)이 있습니다. 내가 COMMENTS CLOB 칼럼을 oracle SQL의 분리 된 (4k) VARCHAR2 컬럼으로 나눌 수있는 방법이 있습니까?CLOB를 여러 VARCHAR2 행으로 변환하는 방법은 무엇입니까?

create or replace procedure longsubstr(p_rowid in rowid, 
             comment in comment) 
          return varchar2 
          as l_tmp long; 
          begin 
          select COMMENT into l_tmp from table_name 
                where rowid = p_rowid; 
          return substr(l_tmp, p_form, p_for); 
          end; 
          /
+0

, 당신이 할 수 있는지 확인하십시오. varchar2 열 이름을 쿼리에 삽입해야하기 때문에 동적입니다. 그렇지 않은 경우 CTE –

+0

에서 수행 할 수있는 쿼리의 값을 얻는 것이었다면 작성해야 할 코드의 예를 보여줄 수 있습니까? – icerabbit

+0

불행히도 여기에 신탁 환경이 없으며 조금 녹슬 었습니다. 다른 사람이 답을 추가 할 수 있는지 보도록하겠습니다. 어떤 시도를해도 좋을 것입니다. –

답변

2

SQLFIDDLE :

SELECT DBMS_LOB.SUBSTR(t.comments, 4000, l.COLUMN_VALUE) 
FROM table_name t 
     CROSS JOIN 
     TABLE(
     CAST(
      MULTISET(
      SELECT LEVEL * 4000 - 3999 
      FROM DUAL 
      CONNECT BY LEVEL * 4000 - 3999 <= DBMS_LOB.GETLENGTH(t.comments) 
      ) AS SYS.ODCINUMBERLIST 
     ) 
     ) l 

또는

WITH positions (comments, pos) AS (
    SELECT comments, 
     1 
    FROM table_name 
UNION ALL 
    SELECT comments, 
     pos + 4000 
    FROM positions 
    WHERE pos + 4000 <= DBMS_LOB.GETLENGTH(comments) 
) 
SELECT DBMS_LOB.SUBSTR(comments, 4000, pos) AS split_comment 
FROM positions 
+0

고마워요. 첫 번째 해결책에서 한 일을 나에게 설명해 주시겠습니까? 그렇지 않다면 나는 여전히 당신의 대답을 가장 좋은 답으로 표시 할 것이지만 어떤 도움이라도 대단히 감사 할 것입니다. 나는 왜 당신이 최종적으로 당신에게 substr 함수의 컬럼 값으로 사용하는 값 ​​'1'을 얻는 데 데카르트 조인을 수행하기로 결정했는지 완전히 이해하지 못한다. 대신 '1'을 사용할 수 없습니까? 그 값을 얻기 위해 데카르트 조인에 어떤 이점이 있습니까? – icerabbit

+0

@icerabbit 계층 적 쿼리에 의해 채워진'VARRAY'를 생성하여'CLOB'의 길이까지 '1,4001,8001, ...'값을주고, 각각의 VARRAY는 적절한 행을 만들고 원래 테이블에 다시 결합하여 해당 위치에서 시작하는 4000 자 하위 문자열을 가져 오는 데 사용됩니다. – MT0

1

당신은

0을 사용할 수 있습니다 여기에

사전

에서

덕분에 아래에있는 내 시도는

dbms_lob.substr(clob_column, for_how_many_bytes, from_which_byte) 기능이에 대한

: 동적 코드와 PLSQL을 통해

declare 
    type typ_comment is table of varchar2(4000); 
    v_varchar typ_comment := typ_comment(); 
    v_clob table_name.comments%type; 
    k   number; 
    j   number := 4000; 
begin 
    select comments into v_clob from table_name where rowid = '&p_rowid'; -- like AAAS9BAAEAAAAEeAAA without quotation 
    k := ceil(dbms_lob.getlength(v_clob)/j); 
    v_varchar.extend(k); 
    for i in 1..k 
    loop 
    v_varchar(i):= dbms_lob.substr(v_clob, j, 1 + j * (i - 1)); 
    end loop; 
end;