Как проверить, равен ли столбец empty_clob () в Oracle? - PullRequest
15 голосов
/ 06 февраля 2009

Наивный FOO = empty_clob() жалуется на несовместимые типы. Я попробовал Googling, но (еще раз) не добился успеха в поиске помощи с Oracle. Благодаря.

Ответы [ 4 ]

16 голосов
/ 06 февраля 2009

Вы просто хотите проверить 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
--------------------------------------------------------------------------------
13 голосов
/ 06 февраля 2009

Если вы пытаетесь провести сравнение в 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, было сопоставимо со значением, на которое указывает локатор LOB, возвращаемый функцией EMPTY_CLOB ().

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
3 голосов
/ 06 февраля 2009

что-то вроде этого должно работать для инициализации:

DECLARE
   dummy  clob;
   dummy2 clob;
BEGIN
     dummy := empty_clob();
      IF dummy = empty_clob() THEN
         dummy2 := dummy;
      END IF;
END;
1 голос
/ 19 августа 2016

Простой способ проверить наличие пустых сгустков в SQLplus - преобразовать все CLOBS в varchar2 (используя функцию TO_CHAR) перед выполнением теста:

SELECT *
  FROM table1
  WHERE TO_CHAR(table1.column1) IS NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...