Oracle将CLOB缓存到临时表

Oracle将CLOB缓存到临时表,oracle,session,plsql,oracle10g,clob,Oracle,Session,Plsql,Oracle10g,Clob,我的Oracle数据库中有两种自定义类型 TYPE SETTING IS OBJECT ( SETT_NAME VARCHAR2(32767), SETT_VALUE CLOB, ); TYPE SETTINGS_SET IS TABLE OF SETTING; 我有一个简单的函数,返回SETTINGS\u SET FUNCTION Revision RETURN SETTINGS_SET PIPELINED IS INSTANCE SETTING; BEGIN --

我的Oracle数据库中有两种自定义类型

TYPE SETTING IS OBJECT (
   SETT_NAME VARCHAR2(32767),
   SETT_VALUE CLOB,
);  

TYPE SETTINGS_SET IS TABLE OF SETTING;
我有一个简单的函数,返回
SETTINGS\u SET

FUNCTION Revision RETURN SETTINGS_SET PIPELINED IS
   INSTANCE SETTING;
BEGIN 
-- body is simplified for example
   INSTANCE = SETTING('Id', 'Long clob value');
   PIPE ROW(INSTANCE);
END;    
或非流水线函数

FUNCTION Revision RETURN SETTINGS_SET IS
   SET SETTINGS_SET = SETTINGS_SET();
BEGIN 
-- body is simplified for example
   SETTINGS_SET(1) := SETTING('Id', 'Long clob value');
END; 
这很好,但oracle会将CLOB值缓存到当前会话的临时存储中。
可以在
v$session
系统表中查看此存储

我的问题是,我的应用程序中只有一个Oracle会话,而且这个存储空间很快就填满了

1) 在这种情况下为什么oracles会缓存clob?
2) 我可以关闭函数中CLOB值的缓存吗?

我还尝试了非管道功能,但rhis没有帮助。

因为您正在管道化输出,所以需要清理用户端上的临时CLOB。这意味着您在函数内部创建指针,并将其传递给最终用户,最终用户需要进行清理。例如:

CREATE OR REPLACE
type MY_CLOB as object
(
  some_char varchar2(4000),
  some_clob clob
);

CREATE OR REPLACE
type MY_CLOB_TAB as table of my_clob;
begin
    for rec in (select some_char, some_clob from table(pipe_clobs))
    loop
        -- use it
        dbms_output.put_line('Clob value is: ' || rec.some_clob);
        -- and free it
        dbms_lob.freetemporary(rec.some_clob);
    end loop;
end;
功能是:

CREATE OR REPLACE function pipe_clobs
return my_clob_tab
pipelined IS
    l_clob_obj my_clob;
    l_clob CLOB;
BEGIN

  for i in 1 .. 10
  loop
    l_clob := 'This is temp clob ' || i;
    l_clob_obj := my_clob('My varchar2 value', l_clob);
    pipe row(l_clob_obj);
  end loop;

END;
用户可能是(例如):

检查方式:

select * from v$temporary_lobs;

如果需要传递大量数据,则需要大量存储,包括磁盘和RAM。你不能开第二节课吗?其中一个似乎有点小。太忙了,无法创建示例atm,但请在管道行之后尝试dbms_lob.freetemporary(您的_clob)。默认情况下,临时CLOB将在超出范围时进行清理(最终),这可能需要很长时间,具体取决于您在此处管道化的行数。@tbone我遇到异常
ORA-22275:指定的LOB定位器无效
,因为我没有使用
dbms\u LOB.createTemporal
创建CLOB,所以您隐式地将字符串转换为CLOB?您正在尝试创建多少个CLOB并通过管道输出?这在会话中多久调用一次?@tbone我创建并每1-2分钟发送100次CLOB,因此我应该清理我的临时存储thx,您的回答帮助我找到了内存泄漏。谢谢