4

SQLPLUSは、私が予期していなかった方法でCLOBのnullと空の文字列を表示しているようです。

SQLPLUSで次のことを試してください(私はOracle 10g Serverを使用しています)。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, '');

OK、いくつかのクエリを実行しましょう。ただし、最初にSQLPLUSにnullを明確に表示するように指示する必要があります。

set null {NULL}

次のクエリでは、行1のみが返されると予想していましたが、2を返します。

select * from tableA where field2 is null;

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

うーん、''CLOBにnullとして格納されますか?

さて、その結果に基づいて、次のクエリは3行すべてを返すと予想しますが{NULL}、行1と3のみに表示されます。しかし、私はこの結果を得ます:

select * from tableA;

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

これは紛らわしいです。当初は1を期待していましたが、nullは2つしかないと思いました。では、ここで何が起こっているのでしょうか。CLOBでは機能しませset nullん。機能する場合は、代わりに何を使用する必要がありますか?

私は実際にnullCLOB値で別の問題を解決しようとしていますが、この紛らわしい動作により、しばらくの間リングを実行していたので、続行する前にこれを理解したいと思います。

前もって感謝します

ボズ

4

3 に答える 3

8

OracleNULLと空の文字列を区別しません。これはよく知られている違反またはSQL基準です。

VARCHAR2これが、デフォルトの文字列タイプがであり、ではない理由ですVARCHAR

現在リリースされているすべてのバージョンで同じですがVARCHAR、使用はお勧めしません。これは、と空の文字列VARCHARを区別することになっているのに対し、標準には記載されていないためです。NULLVARCHAR2

于 2011-01-27T11:08:22.137 に答える
4

これは、SQL*Plusが空の文字列とnull値を処理する方法と関係があると思います。

empty_clob()NULL値は作成しませんが、長さがゼロのCLOBを作成します。

これは、field2がnullである行をクエリしたときに、行2が返されないという事実によって証明されています。

私のJDBCツールを使用すると、nullの列を別の色で強調表示できます。そこでは、empty_clob()のある行は強調表示されませんが、他の2つは強調表示されます。

set nullしたがって、SQL*Plusのオプションの処理が間違っていると思います。次のステートメントを使用すると、違いがわかります。

field1を選択します
       nvl(field2、'これはNULLです')
tableAから;

私の場合、これは次のように表示されます。

フィールド1フィールド2
-----------------------
1これはNULLです
2        
3これはNULLです
于 2011-01-27T11:39:19.487 に答える
2

行 2 に実際にあるものを確認するのは興味深いでしょう。ドキュメントによると(以下を参照) 、実際には null ではない可能性があります。 .

SQL クエリ ツールで SQL ステートメントを実行すると、Oracle は CLOB を任意の長さで切り取られた文字列に暗黙的に変換する傾向があります。

目的

EMPTY_BLOB および EMPTY_CLOB は空の LOB ロケータを返します。これを使用して LOB 変数を初期化したり、INSERT または UPDATE ステートメントで LOB 列または属性を EMPTY に初期化したりできます。EMPTY は、LOB が初期化されているが、データが移入されていないことを意味します。

于 2011-01-27T11:19:15.760 に答える