2012-10-19 13 views
39

Considerando che TEST_SCRIPT è un CLOB per questo che quando ho eseguito questo semplice query da SQL * Plus su Oracle, ottengo l'errore:ORA-00932: datatypes contradditori: atteso - ha CLOB

ORA-00932: inconsistent datatypes: expected - got CLOB 

ho letto un sacco di domande circa lo stesso errore, ma nessuno di quelli in esecuzione di una query direttamente da SQLPLUS

UPDATE IMS_TEST 
     SET TEST_Category = 'just testing' 
    WHERE TEST_SCRIPT = 'something' 
     AND ID    = '10000239' 

esempio completa:

SQL> create table ims_test(
    2 test_category varchar2(30), 
    3 test_script clob, 
    4 id varchar2(30) 
    5 ); 

Table created. 

SQL> insert into ims_test values ('test1','something','10000239'); 

1 row created. 

SQL> UPDATE IMS_TEST 
    2 SET TEST_Category = 'just testing' 
    3 WHERE TEST_SCRIPT = 'something' 
    4 AND ID    = '10000239'; 
WHERE TEST_SCRIPT = 'something' 
     * 
ERROR at line 3: 
ORA-00932: inconsistent datatypes: expected - got CLOB 
+0

Lo script attuale contiene le virgolette inglesi ricce presenti nella domanda? O era solo un artefatto di creare la domanda? Nello script vero e proprio, la stringa ''qualcosa' 'in realtà supera i 4000 caratteri? –

+0

scusa, cosa intendi per virgolette arricciate? Stai suggerendo le virgolette non sono le virgolette giuste? e la stringa s = in questo esempio è proprio quella. Potrei avere dei filamenti più grandi nel prodotto reale, ma sto solo cercando di capire se questa semplice query funziona. – user1298925

+0

@ user1298925, questa query funzionerà ma fallirà se si sta tentando di inserire più di 4000 caratteri nel campo clob –

risposta

43

Non è possibile inserire un CLOB nella clausola WHERE. Dal documentation:

Large objects (LOBs) are not supported in comparison conditions. However, you can use PL/SQL programs for comparisons on CLOB data.

Se i valori sono sempre meno di 4k, è possibile utilizzare:

UPDATE IMS_TEST 
    SET TEST_Category   = 'just testing' 
WHERE to_char(TEST_SCRIPT) = 'something' 
    AND ID      = '10000239'; 

E 'strano per la ricerca da un CLOB comunque .. potrebbe non solo la ricerca per l'ID colonna?

+1

Il campo CLOB non può essere utilizzato anche nel funzionamento MINUS. – Bor

+4

Se i tuoi valori potrebbero essere superiori a 4K, puoi usare 'where dbms_lob.compare (testscript,: var2) = 0' vedi http://stackoverflow.com/a/12590223/1845672 – Roland

+0

il link in questo post non funziona più. .. – Jewels

8

Prendete un substr del CLOB e quindi convertirlo in un char:

UPDATE IMS_TEST 
    SET TEST_Category   = 'just testing' 
WHERE to_char(substr(TEST_SCRIPT, 1, 9)) = 'something' 
    AND ID      = '10000239'; 
16

Lo stesso errore si verifica anche quando si fa SELECT DISTINCT ..., <CLOB_column>, ....

Se questa colonna CLOB contiene valori inferiori al limite per VARCHAR2 in tutte le righe applicabili, è possibile utilizzare to_char(<CLOB_column>) o concatenare i risultati di più chiamate a DBMS_LOB.SUBSTR(<CLOB_column>, ...).

1

Il problema potrebbe risiedere in valori nulli selezionati in combinazione con una colonna di tipo CLOB.

select valueVarchar c1 , 
     valueClob c2 , 
     valueVarchar c3 , 
     valueVvarchar c4 
of Table_1 
union 
select valueVarchar c1 , 
     valueClob c2 , 
     valueVarchar c3 , 
     null c4 
of table_2 

Ho modificato il cursore. Il primo cursore è composto da quattro colonne non null. Il secondo cursore seleziona tre colonne non nulle. I valori nulli sono stati iniettati in cursorForLoop.

0

Ho appena eseguito su questo e ho scoperto per caso che CLOB possono essere utilizzati in una query come:

UPDATE IMS_TEST 
    SET TEST_Category = 'just testing' 
WHERE TEST_SCRIPT LIKE '%something%' 
    AND ID    = '10000239' 

Questo ha funzionato anche per CLOB superiori a 4K

la prestazione non sarà ottimo ma non è stato un problema nel mio caso.