ナイーブFOO = empty_clob()
は、互換性のない型について文句を言います。私はグーグルを試しましたが、(もう一度)Oracleの助けを探すのにほとんど成功しませんでした。ありがとう。
PL/SQLで比較を行う場合は、イゴールのソリューションと同じように同等性をテストできます
SQL> ed
Wrote file afiedt.buf
1 DECLARE
2 dummy clob;
3 BEGIN
4 dummy := empty_clob();
5 IF dummy = empty_clob() THEN
6 dbms_output.put_line( 'Dummy is empty' );
7 ELSE
8 dbms_output.put_line( 'Dummy is not empty' );
9 END IF;
10* END;
SQL> /
Dummy is empty
PL/SQL procedure successfully completed.
SQLでこれを実行しようとしている場合は、DBMS_LOB.COMPARE関数を使用する必要があります。テーブルのLOB列は、実際にはLOBロケーター(つまり、ポインター)であるため、LOBが指す値は、EMPTY_CLOB()関数が返すLOBロケーターが指す値と同等であることに注意してください。
SQL> desc bar
Name Null? Type
----------------------------------------- -------- ------------------------
FOO CLOB
SQL> insert into bar values ('123');
1 row created.
SQL> insert into bar values( empty_clob() );
1 row created.
SQL> insert into bar values( empty_clob() );
1 row created.
SQL> ed
Wrote file afiedt.buf
1 select count(*)
2 from bar
3* where dbms_lob.compare( foo, empty_clob() ) = 0
SQL> /
COUNT(*)
----------
2
SQL> ed
Wrote file afiedt.buf
1 select count(*)
2 from bar
3* where dbms_lob.compare( foo, empty_clob() ) != 0
SQL> /
COUNT(*)
----------
1
長さのないCLOBをチェックしたいだけですか?あなたの求めていることは正確ではありませんが、それは基本的に同じことですか?
select *
from bar
where dbms_lob.getlength(foo) = 0;
これが完全なテストです:
SQL> create table bar (foo clob);
Table created.
SQL> insert into bar values (empty_clob());
1 row created.
SQL> select *
2 from bar
3 where dbms_lob.getlength(foo) = 0;
FOO
--------------------------------------------------------------------------------
このようなものは初期化のために機能するはずです:
DECLARE
dummy clob;
dummy2 clob;
BEGIN
dummy := empty_clob();
IF dummy = empty_clob() THEN
dummy2 := dummy;
END IF;
END;
SQLplusで空のCLOBをテストする簡単な方法は、テストを実行する前に(TO_CHAR関数を使用して)すべてのCLOBをvarchar2に変換することです。
SELECT *
FROM table1
WHERE TO_CHAR(table1.column1) IS NULL