empty_clob 和 Oracle 中的 createtemporary 有什么区别?
What is difference between empty_clob and createtemporary in Oracle?
谁能告诉我 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 function/procedure.
临时 lob 是一个完整的 LOB,与正常的填充 LOB 的唯一区别是它不与 table 相关联,并且它存在于临时 tablespace。有关详细信息,请参阅 here。目的是在临时 space 中操作 LOB,直到您准备好将其存储在正常的 table 行中。
但是,empty_clob
初始化了一个 LOB 定位器并创建了一个适当的长度为 0 的 LOB。我从 Julian Dykes 的出色演示中复制了示例 LOB Internals:
所以你不能在 empty_clob
上调用 dbms_lob.freetemporary
,因为它不在临时 tablespace.
中
编辑:
一旦 empty_clob
存储在 table 中,您可以检查它的 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 是从一个序列生成的,这意味着它很可能在整个数据库中是唯一的。
谁能告诉我 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 function/procedure.
临时 lob 是一个完整的 LOB,与正常的填充 LOB 的唯一区别是它不与 table 相关联,并且它存在于临时 tablespace。有关详细信息,请参阅 here。目的是在临时 space 中操作 LOB,直到您准备好将其存储在正常的 table 行中。
但是,empty_clob
初始化了一个 LOB 定位器并创建了一个适当的长度为 0 的 LOB。我从 Julian Dykes 的出色演示中复制了示例 LOB Internals:
所以你不能在 empty_clob
上调用 dbms_lob.freetemporary
,因为它不在临时 tablespace.
编辑:
一旦 empty_clob
存储在 table 中,您可以检查它的 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 是从一个序列生成的,这意味着它很可能在整个数据库中是唯一的。