oracle - 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 函数/过程。
解决方案
临时 lob 是完整的 LOB,与正常的填充 LOB 的唯一区别是它不与表关联并且它位于临时表空间中。有关详细信息,请参见此处。目的是在临时空间中操作您的 LOB,直到您准备好将其存储在普通表行中。
但是,初始化了一个 LOB 定位器并创建了一个长度为 0 的适当 LOB。我从 Julian Dykes 的出色演示文稿LOB Internalsempty_clob
中复制了示例:
所以你不能调用dbms_lob.freetemporary
an 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 是从一个序列中生成的,这意味着它很可能在整个数据库中是唯一的。
推荐阅读
- go - 为什么 CGO_ENABLE 会对虚拟内存产生如此大的影响?
- c# - 如何在 NLua 的调试脚本下获取函数局部变量?
- android - 制作了一个新应用程序来替换旧的应用程序未安装
- typescript - 动态编程中的打字稿打字?
- excel - 通过多个工作表中的预定义命名范围循环查找
- azure - Azure Active Directory API 获取列表
- javascript - JS 可聚焦 div 防止在 keyup 上滚动
- java - Spring Security OAuth2 - URLEncoded输入键值自动附加到令牌响应json中
- mysql - 将 MySQL 中的非空重复行从多行减少到一
- php - 从不同的表中减去 2 列