programing

ORA-00932: 일치하지 않는 데이터 유형: 예상됨 - CLOB가 있음

lovecodes 2023. 3. 26. 12:19
반응형

ORA-00932: 일치하지 않는 데이터 유형: 예상됨 - CLOB가 있음

그 점을 고려하면TEST_SCRIPT는 입니다.CLOBOracle 상에서 SQL*PLUS에서 이 간단한 쿼리를 실행하면 다음과 같은 오류가 발생하는 이유:

ORA-00932: inconsistent datatypes: expected - got CLOB

동일한 오류에 대한 질문을 많이 읽었지만 SQLPLUS에서 직접 쿼리를 실행하는 질문은 없습니다.

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

완전한 예:

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

WHERE 절에는 CLOB를 넣을 수 없습니다.매뉴얼에서 다음 항목을 참조하십시오.

비교 조건에서는 Large Object(LOB; 큰 개체)는 지원되지 않습니다.그러나 PL/SQL 프로그램을 사용하여 CLOB 데이터를 비교할 수 있습니다.

값이 항상 4k 미만인 경우 다음을 사용할 수 있습니다.

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

어쨌든 CLOB로 검색하는 것은 이상합니다.그냥 아이디 칸으로 검색해주시면 안 될까요?

할 때도 같은 에러가 발생합니다.SELECT DISTINCT ..., <CLOB_column>, ....

이 CLOB 컬럼에 사용할 수 있는 모든 행에서 VARCHAR2의 제한보다 짧은 값이 포함되어 있는 경우to_char(<CLOB_column>)또는, 복수의 콜의 결과를 접속합니다.DBMS_LOB.SUBSTR(<CLOB_column>, ...).

CLOB의 기판을 가져와서 char로 변환합니다.

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

방금 이걸 봤는데 우연히 CLOBs를 비슷한 쿼리에서 사용할 수 있다는 걸 알게 됐어요.

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

이는 4K 이상의 CLOB에도 유효합니다.

퍼포먼스가 좋지는 않겠지만 제 경우에는 문제가 없었습니다.

저는 그 선택지가clobCTE의 컬럼이 이 폭발을 일으켰습니다.즉,

with cte as (
    select
        mytable1.myIntCol,
        mytable2.myClobCol
    from mytable1
    join mytable2 on ...
)
select myIntCol, myClobCol
from cte
where ...

아마도 오라클이 임시 테이블에서 클롭을 처리할 수 없기 때문일 겁니다.

내 값이 4K보다 길어서 사용할 수 없었다.to_char().
기말고사에서 고르는 거였는데select(즉,

with cte as (
    select
        mytable1.myIntCol
    from mytable1
)
select myIntCol, myClobCol
from cte
join mytable2 on ...
where ...

이로 인해 성능 문제가 발생할 경우 유감입니다.

이 문제는 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

나는 커서를 재작업했다.첫 번째 커서는 Null이 아닌 4개의 열로 구성됩니다.두 번째 커서는 Null이 아닌 세 개의 열을 선택합니다.null 값이 cursor For Loop에 삽입되었습니다.

제 경우 Entity Framework를 사용하고 있었는데 사용하려고 했던 컬럼이value- 즉, oracle에 의해 예약된 키워드.

언급URL : https://stackoverflow.com/questions/12980038/ora-00932-inconsistent-datatypes-expected-got-clob

반응형