【问题标题】:How do I test if a column equals empty_clob() in Oracle?如何测试列是否等于 Oracle 中的 empty_clob()?
【发布时间】:2010-10-06 00:13:27
【问题描述】:

天真的FOO = empty_clob() 抱怨不兼容的类型。我尝试了谷歌搜索,但(再一次)在 Oracle 的帮助下几乎没有成功。谢谢。

【问题讨论】:

  • 您确定 FOO 是 CLOB 而不是 BLOB?将 CLOB 与 BLOB 进行比较时会出现不兼容的类型错误——您需要将 BLOB 列与 empty_blob() 进行比较。
  • FOO肯定是CLOB,默认值为empty_clob()

标签: oracle clob


【解决方案1】:
DECLARE
    dummy    CLOB := 'fxsgf';
    dummy1   CLOB;
BEGIN
    IF dummy1 = EMPTY_CLOB ()
    THEN
        DBMS_OUTPUT.put_line ('Dummy1 is empty');
    ELSE
        DBMS_OUTPUT.put_line ('Dummy1 is not empty');
    END IF;

    IF dummy = EMPTY_CLOB ()
    THEN
        DBMS_OUTPUT.put_line ('Dummy is empty');
    ELSE
        DBMS_OUTPUT.put_line ('Dummy is not empty');
    END IF;
END;

【讨论】:

    【解决方案2】:

    在 SQLplus 中测试空 clob 的一种简单方法是在执行测试之前将所有 CLOBS 转换为 varchar2(使用 TO_CHAR 函数):

    SELECT *
      FROM table1
      WHERE TO_CHAR(table1.column1) IS NULL
    

    【讨论】:

      【解决方案3】:

      如果您尝试在 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
      

      【讨论】:

        【解决方案4】:

        您是否只想检查没有任何长度的 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
        --------------------------------------------------------------------------------
        

        【讨论】:

        • 这是当前的解决方法,但对于如此简单的任务来说似乎过于复杂。
        • 如果你想包含 NULL 值,你可以使用select * from bar where nvl(dbms_lob.getlength(foo),0) = 0;
        【解决方案5】:

        这样的东西应该适用于初始化:

        DECLARE
           dummy  clob;
           dummy2 clob;
        BEGIN
             dummy := empty_clob();
              IF dummy = empty_clob() THEN
                 dummy2 := dummy;
              END IF;
        END;
        

        【讨论】:

          猜你喜欢
          • 2013-11-18
          • 1970-01-01
          • 2011-07-17
          • 2015-07-17
          • 2010-12-26
          • 2013-07-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多