如何在oracle中重用临时lob

问题描述

我在 Oracle PL/sql 中有一个程序。该程序执行一些批处理,即。它通过 REST API 将数据按固定数量的记录批量发送到另一个系统。请求和响应对象是 clob,因此我正在创建临时 lob 并为每次迭代释放它。 我的问题是,我不能创建一次临时 lob 并为我处理的每个批次重新使用它,然后最后只释放一次。基本上我想将 create 和 free 带出循环,以便它可以提高性能并重用内存。 当我尝试将其带出循环时,我需要在每次迭代开始时初始化 clob 变量,所以我尝试使用 empty_clob() 但没有奏效。另外分配 null 也不起作用。 我收到错误消息“在...处指定了无效的吊球定位器” 下面是我的伪代码

for i in start_batch to end_batch
loop
dbms_lob.createtemporary(l_clob,TRUE);
...code to generate request object.
dbms_lob.freetemporary(l_clob,TRUE) ;
end loop

解决方法

嗯。我发誓那行得通,但你是对的。我不应该试图记住这些事情。我猜将 '' 分配给 clob 确实将其设置为 null。您不能将空 clob 与 dbms_lob.append 一起使用,因为它基本上需要一个指针。尝试使用连接运算符 ||

我已经确认这有效:

declare
    l_clob clob;
begin
    for i in 1..5 loop
        l_clob := '';
        for j in 1..5 loop
            l_clob := l_clob || 'a';
        end loop;
        dbms_output.put_line(l_clob);
    end loop;
end;

编辑:

我不确定 clobvarchar 连接是否是 varchar,因此限制为 32 kB。但这确实与文档所说的相矛盾。以这个为例:

declare
    c clob;
begin
    for i in 1..40000 loop
        c := c || 'a';
    end loop;
    dbms_output.put_line('len=' || dbms_lob.getlength(c));
end;

结果:

len=40000