Как повторно использовать временный лоб в оракуле

У меня есть одна программа в Oracle PL/SQL. Программа выполняет некоторую пакетную обработку, т.е. он отправляет данные в другую систему через REST API пакетами с фиксированным количеством записей. объект запроса и ответа - это clob, и поэтому я создаю временный lob и освобождаю его для каждой итерации. Мой вопрос: не могу ли я создать временный лоб один раз и повторно использовать его для каждого обрабатываемого пакета, а затем освободить его, наконец, только один раз. По сути, я хочу вывести create и free из цикла, чтобы он мог повысить производительность и повторно использовать память. Когда я пытаюсь вывести его из цикла, мне нужно будет инициализировать переменную clob в начале каждой итерации, поэтому я пробовал использовать empty_clob(), но это не сработало. Также не работает назначение нуля. Я получаю сообщение об ошибке, так как указан неверный локатор lob в... Ниже приведен мой псевдокод

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


person dhananjay sharma    schedule 25.03.2021    source источник


Ответы (1)


Хм. Клянусь, это сработало, но вы правы. Я не должен пытаться запоминать эти вещи. Я предполагаю, что присвоение '' 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;

Редактировать:

Я не уверен, что clob, связанный с varchar, является varchar и, следовательно, ограничен 32 КБ. Но это противоречит тому, что написано в документации. Возьмите это, например:

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
person eaolson    schedule 25.03.2021
comment
я попробовал это, но снова получил ту же ошибку. Неверный локатор lob указан в строке ... но ошибка находится в строке после инициализации l_clob: = ''. мой код dbms_lob.append(l_clob,login_info) - person dhananjay sharma; 26.03.2021
comment
Покажи свой код. Этой строки нет в том, что вы разместили в своем вопросе. - person eaolson; 27.03.2021
comment
l_login --›clob type l_login:='{некоторая структура json для входа в REST API}' dbms_lob.createtemporary(l_clob,TRUE); для i в цикле start_batch to end_batch l_clob := ''; dbms_lob.append(l_clob,l_login); --›ошибка в этой строке dbms_lob.append(l_clob,data_from_cursor); call_to_webservice_proc(l_clob,l_response) ...код для создания объекта запроса. конечная петля; dbms_lob.freetemporary(l_clob,ИСТИНА); - person dhananjay sharma; 30.03.2021
comment
Проблемы начинаются, как только вы инициализируете свою переменную l_clob с помощью ''. Сделайте это как первый оператор в цикле for. Я хочу инициализировать его, чтобы новые данные не добавлялись к старым. - person dhananjay sharma; 31.03.2021
comment
я не могу использовать || оператор, поскольку данные, которые я добавляю, будут иметь тип clob.|| работает find до тех пор, пока размер данных не станет меньше или равен размеру varchar, после чего он не работает, мы должны использовать метод добавления. - person dhananjay sharma; 03.04.2021