Search code examples
oracle-databaseclob

How do I test if a column equals empty_clob() in Oracle?


The naïve FOO = empty_clob() complains about incompatible types. I tried Googling, but (once again) had little success searching for help with Oracle. Thanks.


Solution

  • If you are trying to do the comparison in PL/SQL, you can just test equality as Igor's solution does

    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.
    

    If you are trying to do this in SQL, thougyh, you need to use the DBMS_LOB.COMPARE function. A LOB column in a table is really a LOB locator (i.e. pointer), so what you really care about is that the value pointed to by the LOB is comparable to the value pointed to by the LOB locator returned by the EMPTY_CLOB() function.

    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