Comment puis-je tester si une colonne égale clob() vide dans Oracle?

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

13
demandé sur Hank Gay 2009-02-06 21:15:50

4 réponses

si vous essayez de faire la comparaison dans PL / SQL, vous pouvez juste tester l'égalité comme la solution D'Igor le 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 faire cela en SQL, thougyh, vous devez utiliser le DBMS_LOB.Comparer la fonction. Une colonne de LOB dans une table est en fait un localisateur de LOB (i.e. pointeur), donc ce qui vous intéresse vraiment c'est que la valeur pointée par le LOB est comparable à la valeur pointée par le Localisateur de 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
11
répondu Justin Cave 2009-02-06 20:37:58

voulez-vous juste vérifier un sabot qui n'a pas de longueur? Bien que pas exactement ce que votre demande, c'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
--------------------------------------------------------------------------------
16
répondu Steve K 2009-02-06 18:43:29

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;
3
répondu Igor Zelaya 2009-02-06 18:31:50

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

SELECT *
  FROM table1
  WHERE TO_CHAR(table1.column1) IS NULL
1
répondu user6735282 2016-08-19 14:32:05