gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:35:52 45 4
gpt4 key购买 nike

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

最佳答案

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

然而,empty_clob初始化了一个 LOB 定位器并创建了一个长度为 0 的适当 LOB。我从 Julian Dykes 的优秀演示文稿中复制了示例 LOB Internals :

enter image description here

所以你不能打电话dbms_lob.freetemporaryempty_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 是从一个序列生成的,这意味着它在整个数据库中很可能是唯一的。

关于oracle - Oracle 中的 empty_clob 和 createtemporary 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62102136/

45 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com