我的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值吗? 我也尝试过非管道功能,但是没有帮助。
答案 0 :(得分: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;