Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么SQLPLUS将空CLOB和null CLOB显示为null?_Sql_Oracle_Null_Sqlplus_Clob - Fatal编程技术网

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

为什么SQLPLUS将空CLOB和null CLOB显示为null?,sql,oracle,null,sqlplus,clob,Sql,Oracle,Null,Sqlplus,Clob,SQLPLUS似乎以一种我没有预料到的方式为clob显示null和空字符串 在SQLPLUS中尝试以下操作(我使用的是oracle10gserver)。创建一个带有CLOB的表,并插入null、空CLOB和我认为的空字符串: create table tableA (field1 number, field2 clob); insert into tableA values (1, null); insert into tableA values (2, empty_clob()); inser

SQLPLUS似乎以一种我没有预料到的方式为clob显示null和空字符串

在SQLPLUS中尝试以下操作(我使用的是oracle10gserver)。创建一个带有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不起作用吗?如果是,我应该用什么来代替

实际上,我正试图用空CLOB值解决一个不同的问题,但这种令人困惑的行为让我运行Ring有一段时间了,所以我想在继续之前了解一下这一点

提前谢谢


Boz

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

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


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

看看第2行到底是什么会很有趣。它可能不是真正的null,因为(见下文)empty_clob()将返回一个没有数据的初始化clob locate(对于null问题有些不清楚)

在SQL查询工具中执行SQL语句时,尽管Oracle倾向于隐式地将CLOB转换为以任意长度截断的字符串

目的


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

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

empty\u clob()
不会创建空值,而是创建长度为零的clob

当查询字段2为null的行时,第2行不会返回,这一事实证明了这一点

使用我的JDBC工具,我可以用不同的颜色高亮显示空的列,其中带有空的_clob()的行不会高亮显示,而其他两行则会高亮显示

所以我想说,在SQL*Plus中,对
setnull
选项的处理是错误的。通过以下陈述,您将看到差异:

select field1, nvl(field2, 'THIS IS NULL') from tableA; 选择字段1, nvl(字段2,“此为空”) 来自表A; 对我来说,这显示:

field1 field 2 ----------------------- 1 THIS IS NULL 2 3 THIS IS NULL 字段1字段2 ----------------------- 1这是空的 2. 3这是空的