为什么SQLPLUS将空和空CLOB显示为null?

时间:2011-01-27 11:05:27

标签: sql oracle null sqlplus clob

似乎SQLPLUS以我不期望的方式显示CLOB的空值和空字符串。

在SQLPLUS中尝试以下内容(我使用的是Oracle 10g服务器)。创建一个包含CLOB的表,并插入null,空clob,以及我认为的空字符串:

create table tableA (field1 number, field2 clob);
insert into tableA values (1, null);
insert into tableA values (2, empty_clob());
insert into tableA values (3, '');

好的,让我们做一些查询,但首先我们需要告诉SQLPLUS为我们清楚地显示空值:

set null {NULL}

对于以下查询,我原本只期望返回第1行,但它返回2:

select * from tableA where field2 is null;

field1   field 2
-----------------------
1        {NULL} 
3        {NULL} 

嗯,所以''在CLOB中存储为空?

好的,基于该结果,我现在希望以下查询返回所有3行,但仅在行1和3中显示{NULL}。但是我得到了这个结果:

select * from tableA;

field1   field 2
-----------------------
1        {NULL} 
2        {NULL} 
3        {NULL} 

这令人困惑。我以为只有2个空值,即使我最初预期为1.那么这里发生了什么? set null不适用于CLOB,如果是,那么我应该使用什么呢?

我实际上是在尝试使用null CLOB值来解决另一个问题,但是这种令人困惑的行为让我运行了一段时间的响铃,所以在继续之前我想了解这一点。

提前致谢

博兹

3 个答案:

答案 0 :(得分:8)

Oracle不区分NULL和空字符串。这是众所周知的违规行为或SQL标准。

这是默认字符串类型为VARCHAR2而不是VARCHAR的原因。

在所有当前发布的版本中,它们是相同的,但不建议使用VARCHAR。这是因为VARCHAR应区分NULL和空字符串,而标准中未描述的VARCHAR2则不是。

答案 1 :(得分:3)

我认为这与SQL * Plus处理空字符串和空值的方式有关。

empty_clob()不会创建NULL值,而是一个长度为零的CLOB。

当您查询field2为null的行时,未返回第2行的事实证明了这一点。

使用我的JDBC工具,我可以突出显示具有不同颜色的null的列,并且没有突出显示具有empty_clob()的行,而其他两个是。

所以我说这是对SQL * Plus中set null选项的错误处理。通过以下声明,您将看到不同之处:

select field1, 
       nvl(field2, 'THIS IS NULL')
from tableA;

对我来说,这显示:

field1   field 2
-----------------------
1        THIS IS NULL 
2        
3        THIS IS NULL

答案 2 :(得分:2)

看到第2行真正的内容会很有趣。根据documentation(见下文),empty_clob()将返回没有数据的初始化clob定位,这可能不会真正为空(在null问题上有点不清楚。)

在SQL查询工具中执行SQL语句时虽然Oracle倾向于将CLOB隐式转换为以任意长度切断的字符串。

目的

EMPTY_BLOB和EMPTY_CLOB返回一个空的LOB定位符,可用于初始化LOB变量,或者在INSERT或UPDATE语句中,将LOB列或属性初始化为EMPTY。 EMPTY表示LOB已初始化,但未填充数据。