2009-02-06 38 views
12

El ingenuo FOO = empty_clob() se queja de tipos incompatibles. Probé con Google, pero (una vez más) tuve poco éxito en la búsqueda de ayuda con Oracle. Gracias.¿Cómo puedo comprobar si una columna es igual a empty_clob() en Oracle?

+0

¿Estas seguro que FOO es un CLOB y no un BLOB? Obtendría un error de tipo incompatible al comparar un CLOB con un BLOB. Tendría que comparar una columna BLOB con empty_blob(). –

+0

FOO es definitivamente un CLOB, y el valor predeterminado es empty_clob() –

Respuesta

8

Si usted está tratando de hacer la comparación en PL/SQL, que sólo puede probar la igualdad como solución de Igor lo hace

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 está intentando hacer esto en SQL, sin embargo, necesita usar la función DBMS_LOB.COMPARE. Una columna LOB en una tabla es realmente un localizador LOB (es decir, un puntero), entonces lo que realmente importa es que el valor apuntado por el LOB sea comparable al valor apuntado por el localizador LOB devuelto por la función 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

algo como esto debería funcionar para la inicialización:

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

simplemente que desean para comprobar si hay un CLOB que no tenga cualquier longitud? Si bien no es exactamente lo que preguntas, ¿es básicamente lo mismo?

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

Aquí está la prueba completa:

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

Esta es la solución actual, pero parece demasiado complicado para una tarea tan simple. –

1

Una forma sencilla de comprobar la CLOBs vacíos en SQLPLUS es convertir todo el CLOBS a varchar2 (utilizando la función TO_CHAR) antes de realizar la prueba:

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

Esta debería ser la respuesta aceptada –

Cuestiones relacionadas