在Oracle中重用CLOB

时间:2016-07-12 05:04:42

标签: sql oracle clob

如果我要重用我的CLOB变量,将它重新初始化为新值就足够了还是我需要使用freetemporary函数?你还有其他办法(最佳方式)吗?

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 个答案:

答案 0 :(得分:1)

您的代码很好(顶部和底部版本)。

请参阅Oracle Documentation: PL/SQL Semantics for LOBs

  

PL / SQL中的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行中,是临时的   隐式创建CLOB revisedStory CLOB指向buffer VARCHAR2(32000) DBMS_LOB.CREATETEMPORARY(revisedStory); buffer := UPPER(DBMS_LOB.SUBSTR(myStory,100,1)); DBMS_LOB.WRITE(revisedStory,length(buffer),1, buffer);   定位。在当前界面中,该行可以扩展为:

myGist
     

在第13行中,LOB附加到临时DBMS_LOB.WRITEAPPEND(revisedStory, myGist, length(myGist)); 的末尾   具有相同的效果:

DBMS_LOB

因此,您无需调用DBMS_LOB过程,因为PL / SQL会将您的代码隐式转换为适当的SELECT调用。

您也不需要将值释放为:

  

由于DBMS_LOB.FREETEMPORARYCLOB而在程序块中创建的临时LOB   在PL / SQL结束时自动释放赋值   块/功能/过程。您可以选择释放临时LOB   通过调用回收系统资源和临时表空间   // Replace EnvDTE.Constants.vsWindowKindSolutionExplorer with the GUID you need. [ProvideToolWindow(typeof(IssuesWindow), Style = VsDockStyle.Tabbed, Window = EnvDTE.Constants.vsWindowKindSolutionExplorer)] 变量上的listener

但是,如果要控制释放内存的时间(就像在底部版本中那样),您可以选择手动调用此方法。