2011-01-27 103 views
4

看來SQLPLUS以一種我並不期待的方式顯示CLOB的空值和空字符串。爲什麼SQLPLUS將空和空CLOB顯示爲空?

在SQLPLUS中嘗試以下操作(我正在使用Oracle 10g服務器)。與CLOB創建一個表,然後將空,空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, ''); 

OK,讓我們做一些查詢,但首先我們需要告訴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值不同的問題,但這種令人困惑的行爲讓我跑了一段時間,所以我想在繼續之前理解這一點。

預先感謝

博茲

回答

8

OracleNULL和一個空字符串之間進行區分。這是一個衆所周知的違規或SQL標準。

這是默認字符串類型爲VARCHAR2而不是VARCHAR的原因。

在所有當前發佈的版本中它們都是相同的,但不建議使用VARCHAR。這是因爲VARCHAR應該區分NULL和空字符串,而標準中沒有描述的VARCHAR2不是。

2

看看第2行真的很有意思,根據documentation(見下文),empty_clob()將返回一個沒有數據的初始化clob定位, null問題)。

在SQL查詢工具中執行SQL語句時,雖然Oracle傾向於隱式地將CLOB轉換爲以任意長度切斷的字符串。

目的

EMPTY_BLOB和EMPTY_CLOB返回可用於初始化一個LOB變量,或者在INSERT或UPDATE語句空LOB定位器,以初始化LOB列或屬性爲空。 EMPTY意味着LOB已初始化,但未填充數據。

3

我認爲這與SQL * Plus處理空字符串和空值的方式有關。

empty_clob()不會創建NULL值,而是一個長度爲零的CLOB。

當您查詢field2爲空的行時,不會返回行2所證明的事實。

使用我的JDBC工具,我可以突出顯示不同顏色的空列,並且那裏的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