首页 > 解决方案 > Oracle 中的 empty_clob 和 createtemporary 有什么区别?

问题描述

谁能告诉我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 函数/过程。

标签: oracleplsqllob

解决方案


临时 lob 是完整的 LOB,与正常的填充 LOB 的唯一区别是它不与表关联并且它位于临时表空间中。有关详细信息,请参见此处。目的是在临时空间中操作您的 LOB,直到您准备好将其存储在普通表行中。

但是,初始化了一个 LOB 定位器并创建了一个长度为 0 的适当 LOB。我从 Julian Dykes 的出色演示文稿LOB Internalsempty_clob中复制了示例:

在此处输入图像描述

所以你不能调用dbms_lob.freetemporaryan empty_clob,因为它不在临时表空间中。

编辑:

一旦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

根据 Julian 的说法,LOBID 是从一个序列中生成的,这意味着它很可能在整个数据库中是唯一的。


推荐阅读