2009-02-06 5 views
12

L'ingenuo FOO = empty_clob() si lamenta di tipi incompatibili. Ho provato Google, ma (ancora una volta) ha avuto poco successo alla ricerca di aiuto con Oracle. Grazie.Come verificare se una colonna è uguale a empty_clob() in Oracle?

+0

Sei sicuro che FOO è un CLOB e non un BLOB? Si otterrebbe un errore di tipo incompatibile confrontando un CLOB con un BLOB: sarà necessario confrontare una colonna BLOB con empty_blob(). –

+0

FOO è sicuramente un CLOB e il valore predefinito è empty_clob() –

risposta

8

Se si sta cercando di fare il confronto in PL/SQL, si può solo testare l'uguaglianza come soluzione di Igor non

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. 

Se stai provando a farlo in SQL, hai bisogno di usare la funzione DBMS_LOB.COMPARE. Una colonna LOB in una tabella è in realtà un locator LOB (cioè un puntatore), quindi quello che interessa davvero è che il valore indicato dal LOB è paragonabile al valore indicato dal localizzatore LOB restituito dalla funzione 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

qualcosa come questo dovrebbe funzionare per l'inizializzazione:

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

Stai semplicemente desideroso di verificare la presenza di un CLOB che non ha certo periodo? Anche se non è esattamente quello che chiedi, è fondamentalmente la stessa cosa?

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

Ecco la prova 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

Questa è la soluzione corrente, ma sembra eccessivamente complicata per un'attività così semplice. –

1

Un modo semplice per testare CLOB vuoti in SQLplus è quello di convertire tutte le CLOB a VARCHAR2 (utilizzando la funzione TO_CHAR) prima di eseguire il test:

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

Questa dovrebbe essere la risposta accettata –

Problemi correlati