20

ナイーブFOO = empty_clob()は、互換性のない型について不平を言います。私はグーグルを試しましたが、(もう一度) Oracle のヘルプを検索することにほとんど成功しませんでした。ありがとう。

4

5 に答える 5

20

長さがない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
--------------------------------------------------------------------------------
于 2009-02-06T18:43:29.917 に答える
18

PL/SQL で比較を行おうとしている場合は、Igor のソリューションと同じように等価性をテストできます。

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
于 2009-02-06T20:37:58.127 に答える