2016-07-12 5 views
1

CLOB 변수를 다시 사용하려면 새 값으로 다시 초기화해야합니까, 아니면 freetemporary 함수를 사용해야합니까? 이 작업을 수행하는 다른 방법 (최선의 방법)이 있습니까?Oracle에서 CLOB 다시 사용

DECLARE 
    message CLOB; 
BEGIN 

    message := 'The quick brown fox jumps over the lazy dog.'; 

    dbms_output.put_line(message); 

    message := 'Test'; 

    dbms_output.put_line(message); 

END; 

또는

DECLARE 
    message CLOB; 
BEGIN 

    message := 'The quick brown fox jumps over the lazy dog.'; 

    dbms_output.put_line(message); 

    dbms_lob.freetemporary(message); 

    message := 'Test'; 

    dbms_output.put_line(message); 

END; 

답변

1

코드는 잘 (상단과 하단 버전)입니다. 임시 CLOB이며,

1 declare 
2 myStory CLOB; 
3 revisedStory CLOB; 
4 myGist VARCHAR2(100); 
5 revisedGist VARCHAR2(100); 
6 BEGIN 
7 -- select a CLOB column into a CLOB variable 
8 SELECT Story INTO myStory FROM print_media WHERE product_id=10; 
9 -- perform VARCHAR2 operations on a CLOB variable 
10 revisedStory := UPPER(SUBSTR(myStory, 100, 1)); 
11 -- revisedStory is a temporary LOB 
12 -- Concat a VARCHAR2 at the end of a CLOB 
13 revisedStory := revisedStory || myGist; 
14 -- The following statement will raise an error because myStory is 
15 -- longer than 100 bytes 
16 myGist := myStory; 
17 END; 

"PL/SQL에서 CLOB 변수"의 라인 (10)에 유의하시기 바랍니다 PL/SQL에서

CLOB 변수 :

Oracle Documentation: PL/SQL Semantics for LOBs를 참조하십시오 암시 적으로 생성되고 가리키는 곳은 revisedStoryCLOB 로케이터입니다.

DBMS_LOB.WRITEAPPEND(revisedStory, myGist, length(myGist)); 

:

라인 13
buffer VARCHAR2(32000) 
DBMS_LOB.CREATETEMPORARY(revisedStory); 
buffer := UPPER(DBMS_LOB.SUBSTR(myStory,100,1)); 
DBMS_LOB.WRITE(revisedStory,length(buffer),1, buffer); 

, myGist는 동일한 효과를 갖는다 임시 LOB의 단부에 첨부되어 같이 현재 인터페이스의 라인 확장 될 수있다 따라서 DBMS_LOB 프로 시저를 호출 할 필요가 없습니다. PL/SQL이 코드를 암시 적으로 적절한 DBMS_LOB 호출로 변환하기 때문입니다.

또한 같은 값을 확보 할 필요가 없습니다 다음 PL/SQL 의 끝에서 자동으로 해제됩니다 SELECT 또는 할당의 결과로 프로그램 블록에서 만든

임시 LOB를 블록/기능/절차. 임시 LOB를 컴퓨터 자원 및 임시 테이블 공간을 다시 확보하도록 선택하려면 CLOB 변수에 DBMS_LOB.FREETEMPORARY을 호출하십시오.

그러나 하단 버전에서와 같이 메모리가 해제되는 시점을 제어하려면 수동으로 호출하도록 선택할 수 있습니다.

+0

감사합니다. 그래도 전세계 CLOB는 어떻습니까? DBMS_LOB.FREETEMPORARY가 CLOB을 NULL에 할당하고 있습니까? – superigno

+0

@superigno 설명서에서 불분명합니다. DBMS_LOB.FREETEMPORARY()는 모든 메모리를 해제 할 수 있지만 NULL을 할당하면 메모리가 NULL 값이고 다른 값은 아니지만 대다수를 릴리스 할 수 있음을 알 수 있어야합니다. 이전에는 텍스트 용으로 할당 된 메모리)를 사용하지 않고 내부 작업에 액세스하지 않아도됩니다. – MT0