如果我要重用我的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;
答案 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.FREETEMPORARY
或CLOB
而在程序块中创建的临时LOB 在PL / SQL结束时自动释放赋值 块/功能/过程。您可以选择释放临时LOB 通过调用回收系统资源和临时表空间// Replace EnvDTE.Constants.vsWindowKindSolutionExplorer with the GUID you need. [ProvideToolWindow(typeof(IssuesWindow), Style = VsDockStyle.Tabbed, Window = EnvDTE.Constants.vsWindowKindSolutionExplorer)]
变量上的listener
。
但是,如果要控制释放内存的时间(就像在底部版本中那样),您可以选择手动调用此方法。