2016-07-12 13 views
1

CLOB変数を再利用しようとすると、それを新しい値に再初期化するか、フリータイム機能を使用する必要がありますか?これを行うには他の方法(最善の方法)がありますか?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; 

OR

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コールに変換するためです。

のようにしても値を解放する必要はありません:SELECTまたは 割り当ての結果として、プログラムブロックで作成した一時LOBは、PL/SQLの終了時に自動的に解放され

ブロック/関数/プロシージャ。変数の DBMS_LOB.FREETEMPORARYをコールして、一時LOBを解放してシステム・リソースと一時表領域を再利用することができます。

ただし、メモリを解放するタイミングを制御する場合は、手動で呼び出すこともできます(下のバージョンと同じように)。

+0

ありがとうございました!しかし、どのようにグローバルCLOBs? DBMS_LOB.FREETEMPORARYで、NULLにCLOBを同じに割り当てるかどうか – superigno

+0

@superignoそれはドキュメントからはっきりしていません。 DBMS_LOB.FREETEMPORARY()はすべてのメモリを解放することができますが、 'NULL'を割り当てることは、それが' NULL'値で、他の値ではなく、大部分を解放することができるように、メモリを保持しなければなりません以前はテキスト用に割り当てられていたメモリの容量)が、内部的な動作にアクセスすることなく推測されます。 – MT0