Oracle中的empty_clob和createtemporary有什么区别?

Oracle中的empty_clob和createtemporary有什么区别?,oracle,plsql,lob,Oracle,Plsql,Lob,谁能告诉我empty\u 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

谁能告诉我
empty\u 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\u clob
返回的空对象定位器传递给任何dbms\u lob函数/过程。

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

但是,
empty\u clob
初始化了LOB定位器,并创建了长度为0的适当LOB。我从朱利安·戴克斯出色的演讲中复制了他的例子:

因此,您不能在
空的\u clob
上调用
dbms\u lob.freetemporary
,因为它不在临时表空间中

编辑:

空\u 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是从一个序列生成的,这意味着它在整个数据库中很可能是唯一的。

您是否有一个函数的示例错误消息,除了
空的\u clob
?这对我很有用:
从dual中选择dbms\u lob.getlength(empty\u clob())