2014-01-19 3 views
20

Я не совсем понимаю смысл функции dbms_lob.createtemporary(). Как:Что такое dbms_lob.createtemporary()?

DECLARE 
    myclob CLOB; 
BEGIN 
    myclob := 'foo'; 
END; 

не отличается от:

DECLARE 
    myclob CLOB; 
BEGIN 
    dbms_lob.createtemporary(myclob, TRUE); 
    myclob := 'foo'; 
    dbms_lob.freetemporary(myclob); 
END; 

Я предполагаю, что действия в между создавать и бесплатные звонки делают его актуальным, но я просто не понятно, каким образом.

+0

Возможно, 'dbms_lob.freetemporary' освобождает блок памяти (который может быть достаточно большим), не дожидаясь перемены, выходит за пределы области видимости, поэтому вы можете более эффективно управлять использованием памяти. –

ответ

14

В прежние времена вы всегда были вынуждены использовать пакет DBMS_LOB. Затем в Oracle 10g была введена функция, называемая «семантика SQL для LOB», и теперь вы можете использовать упрощенный синтаксис.

В CREATETEMPORARY вы можете указать длительность LOB в семантике SQL, которой вы не можете.

В вашем случае LOB освобождается таким же образом, то есть когда вы покидаете область действия (то есть блок PL/SQL), где объявляется LOB, тогда она освобождается.

Когда вы используете FREETEMPORARY, тогда временный сегмент в табличном пространстве освобождается, когда вы вызываете myclob := NULL;, он будет сохранен.