1

我的 Oracle DB 中有两种自定义类型

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

TYPE SETTINGS_SET IS TABLE OF SETTING;

我有简单的函数返回SETTINGS_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 没有帮助。

4

1 回答 1

2

由于您正在管道输出,因此您需要清理用户端的临时 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;

功能是:

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;

用户将是(例如):

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;

通过以下方式检查:

select * from v$temporary_lobs;
于 2013-06-10T20:45:29.857 回答