2017-05-15 2 views
0

CLOB의 모든 데이터를 문자열로 변환하려고합니다. DBMC_LOB.SUBSTR은 4000 문자를 한 번에 가져 오는 방법을 제공합니다. 나는 MS SQL 배경에서 오라클 쿼리를 인식하지 못합니다. 누군가가 구문을 도와 줄 수 있습니까?오라클은 문자열을 얻기 위해 CLOB을 반복합니다.

내가 함수를 만들고 싶어하고

// Get the length of CLOB 
// totalIterationsRequired = length/4000; 
// LOOP around the CLOB and fetch 4000 char at once 
For i in 1..totalIterationsRequired 
LOOP 
// Insert the substring into a varchar2 
// DBMC_LOB.SUBSTR(xml_value,4000*i,(4000*(i-1)+1) 
END LOOP 
// The function will return the varchar2 
+0

당신의 질문을하시기 바랍니다 것입니다. 감사. – anonyXmous

+0

구문에 대한 도움이 필요합니다. 질문 – Ankit

답변

2
create table save_table(rec varchar2(4000)); 

create or replace PROCEDURE save_clob (p_clob IN CLOB) 
AS 
    l_length    INTEGER; 
    l_start    INTEGER := 1; 
    l_recsize CONSTANT INTEGER := 4000; 
BEGIN 
    l_length := DBMS_LOB.getlength (p_clob); 

    WHILE l_start <= l_length 
    LOOP 
     INSERT INTO save_table (rec) 
      VALUES (DBMS_LOB.SUBSTR (p_clob, l_recsize, l_start)); 

     l_start := l_start + l_recsize; 
    END LOOP; 
END save_clob; 
+0

업데이트 됨 save_table에서 오류가 발생한다고 생각합니다. 그리고 저장 될 문자열을 어디에 추가 할 것인가?) clob이 반환 되는가? – Ankit

+1

이 코드는 작동하지만 기존 패키지에서 추출되었습니다. 이 예제에서는 결과를 'SAVE_TABLE'이라는 테이블에 저장합니다. 그런 다음 테이블에서 결과를 선택합니다. 그것은 기능이 아닙니다. PL/SQL 함수는 SQL 함수 4000 인 32767 자만 반환 할 수 있습니다 (기본적으로 데이터베이스는 더 큰 값으로 구성 될 수 있습니다). CLOB를 사용하는 이유는 내용이 문자열 내에 맞지 않기 때문입니다. CLOB 크기가 너무 크면 어떻게 할 것입니까? –

+0

당신은 정확하지만 이것은 컴파일되지 않습니다. 구문에 뭔가 잘못되었다고 생각합니다. – Ankit

0

같은 일을 할 다음은 함수 정의

create or replace function getclobastable (id IN VARCHAR2) 
    return clob_table 
is 
    l_length    INTEGER; 
    l_start    INTEGER := 1; 
    l_recsize CONSTANT INTEGER := 4000; 
    i_clob     CLOB; 
    n BINARY_INTEGER := 0; 
    save_table clob_table := clob_table(); 
BEGIN 

    save_table := clob_table(); 
    -- Get the CLOB data into i_clob 
    l_length := DBMS_LOB.getlength (i_clob); 

    WHILE l_start <= l_length 
    LOOP 
     n := n + 1; 

     save_table.EXTEND(); 
     save_table(n) := DBMS_LOB.SUBSTR (i_clob, l_recsize, l_start); 

     l_start := l_start + l_recsize; 
    END LOOP; 
    RETURN save_table; 
END; 
관련 문제