Comment puis-je tester si une colonne est égale à EMPTY_CLOB () dans Oracle?

StackOverflow https://stackoverflow.com/questions/521490

  •  22-08-2019
  •  | 
  •  

Question

Le FOO = empty_clob() naïf se plaint de types incompatibles. J'ai essayé googler, mais (encore une fois) a eu peu de succès la recherche d'aide avec Oracle. Merci.

Était-ce utile?

La solution

Si vous essayez de faire la comparaison en PL / SQL, vous pouvez tester l'égalité en tant que solution d'Igor fait

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.

Si vous essayez de le faire dans SQL, thougyh, vous devez utiliser la fonction DBMS_LOB.COMPARE. Une colonne LOB dans une table est vraiment un LOB (c.-à-pointeur), donc ce que vous tenez vraiment à est que la valeur pointée par le LOB est comparable à la valeur pointée par le LOB retourné par la fonction 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

Autres conseils

Êtes-vous simplement vouloir vérifier un CLOB qui n'a pas de longueur? Bien que pas exactement ce que votre demande, il est fondamentalement la même chose?

select *
  from bar
 where dbms_lob.getlength(foo) = 0;

Voici le test complet:

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
--------------------------------------------------------------------------------

quelque chose comme cela devrait fonctionner pour l'initialisation:

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

Une façon simple de tester CLOBs vides dans SQLplus est de convertir tous les CLOBS à varchar2 (en utilisant la fonction TO_CHAR) avant d'effectuer le test:

SELECT *
  FROM table1
  WHERE TO_CHAR(table1.column1) IS NULL
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top