В чем разница между empty_clob и create Contemporary в Oracle? - PullRequest
2 голосов
/ 30 мая 2020

Кто-нибудь, пожалуйста, скажите, в чем разница c между empty_clob и createtemporary.

Вот мой код.

/*empty_clob vs createtemporary()*/
DECLARE
    elob   CLOB;
    tlob   CLOB;
BEGIN
    IF elob IS NULL THEN
        dbms_output.put_line('elob is null');
    ELSE
        dbms_output.put_line('elob has a locator');
    END IF;

    IF tlob IS NULL THEN
        dbms_output.put_line('tlob is null');
    ELSE
        dbms_output.put_line('tlob has a locator');
    END IF;

    elob := empty_clob;
    dbms_lob.createtemporary(tlob, false);

    IF elob IS NULL THEN
        dbms_output.put_line('elob is null');
    ELSE
        dbms_output.put_line('elob has a locator');
    END IF;

    IF tlob IS NULL THEN
        dbms_output.put_line('tlob is null');
    ELSE
        dbms_output.put_line('tlob has a locator');
    END IF;

    dbms_lob.freetemporary(elob); -- exception
    dbms_lob.freetemporary(tlob);
END;

и почему я не могу пройти указатель пустых объектов, который возвращается empty_clob любой функции / процедуре dbms_lob.

1 Ответ

1 голос
/ 31 мая 2020

Временный большой объект - это полноценный большой объект, единственное отличие от обычного заполненного большого объекта в том, что он не связан с таблицей и находится во временном табличном пространстве. Подробнее см. здесь . Цель состоит в том, чтобы управлять вашим LOB во временном пространстве, пока вы не будете готовы сохранить его в обычной строке таблицы.

Однако empty_clob инициализировал локатор LOB и создает правильный LOB длиной 0. Я скопировал Пример Джулиана Дайкса из его превосходной презентации LOB Internals :

enter image description here

Таким образом, вы не можете позвонить dbms_lob.freetemporary на empty_clob , потому что его нет во временном табличном пространстве.

EDIT:

После того, как empty_clob сохранен в таблице, вы можете проверить его LOBID:

CREATE TABLE t (c CLOB, e CLOB DEFAULT EMPTY_CLOB()) LOB (e) STORE AS SECUREFILE;
INSERT INTO t (c) VALUES (null);

SELECT DBMS_LOBUTIL.getinode(e).lobid   AS lobid,
       DBMS_LOBUTIL.getinode(e).length  AS length,
       DBMS_LOBUTIL.getinode(e).extents AS extents
  FROM t;

LOBID                  LENGTH   EXTENTS
0000000100000007E5E1   0        0

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

...