2012-10-19 13 views
39

Zważywszy, że TEST_SCRIPT jest CLOB dlaczego po uruchomieniu tej prostej kwerendy z SQL * Plus na Oracle, pojawia się błąd:ORA-00932: niespójne datatypes: Oczekuje - dostał CLOB

ORA-00932: inconsistent datatypes: expected - got CLOB 

Czytam wiele pytań dotyczących tego samego błędu, ale żaden z nich nie działa bezpośredniego zapytania z sQLPLUS

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

Pełny przykład:

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

Czy w twoim aktualnym skrypcie znajdują się kręcone cytaty firmy Microsoft, które były obecne w pytaniu? A może był to tylko artefakt tworzenia pytania? Czy w aktualnym skrypcie ciąg "coś" ma w rzeczywistości ponad 4000 znaków? –

+0

Przepraszam, co masz na myśli przez kręcone cytaty? Sugerujesz, że cytaty nie są poprawnymi cytatami? a ciąg s = w tym przykładzie jest właśnie taki. Mogę mieć większy strins w prawdziwym produkcie, ale próbuję tylko sprawdzić, czy to proste zapytanie działa. – user1298925

+0

@ user1298925, to zapytanie zadziała, ale nie powiedzie się, jeśli próbujesz wstawić więcej niż 4000 znaków w polu typu clob –

Odpowiedz

43

Nie można umieścić elementu CLOB w klauzuli WHERE. Z documentation:

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

Jeśli wartości są zawsze mniejsze niż 4k, można użyć:

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

To dziwne, aby szukać według CLOB anyways .. można nie tylko szukać według identyfikatora kolumna?

+1

Pole CLOB również nie może być używane w trybie MINUS. – Bor

+4

Jeśli Twoje wartości mogą być większe niż 4K, możesz użyć 'gdzie dbms_lob.compare (testscript,: var2) = 0' patrz http://stackoverflow.com/a/12590223/1845672 – Roland

+0

link w tym wpisie już nie działa. .. – Jewels

8

Weź substr z CLOB, a następnie przekształcić go char:

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

Ten sam błąd występuje również wtedy, gdy robi SELECT DISTINCT ..., <CLOB_column>, ....

Jeśli ta kolumna CLOB zawiera wartości krótsze niż limit dla VARCHAR2 we wszystkich odpowiednich wierszach, można użyć to_char(<CLOB_column>) lub połączyć wyniki wielu połączeń z numerem DBMS_LOB.SUBSTR(<CLOB_column>, ...).

1

Problem może dotyczyć wybranych wartości pustych w połączeniu z kolumną typu 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 

Przebudowałem kursor. Pierwszy kursor składa się z czterech niepustych kolumn. Drugi kursor wybiera trzy niepuste kolumny. Wartości puste zostały wprowadzone do cursorForLoop.

0

Właśnie przejechał ten jeden i znalazłem przez przypadek, że CLOB może być stosowany w podobny zapytania:

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

ten pracował również dla CLOB większe niż 4K

wydajność nie będzie świetnie, ale w moim przypadku nie było to problemem.