2013-11-21 2 views
0

중첩 테이블로 여러 clob을 선택해야합니다.clobs에서 함수를 수집하십시오.

select cast(collect(vc_val) as varchar_t) from t; 

을 그리고 다음과 같은 실패 이유 :

create table t (vc_val varchar2(100), clob_val clob); 
create type varchar_t as table of varchar2(100); 
create type clob_t as table of clob; 

미세 쿼리를 작품에 따라? 두 번째 쿼리가 실패하는 이유

select cast(collect(clob_val) as clob_t) from t; 

이 예제 링크 http://sqlfiddle.com/#!4/b01e7/3

누군가 나를 설명 할 수 있습니까?

답변

3

CAST은 LOB 유형을 지원하지 않으므로 작동하지 않습니다.

당신은 오라클의 문서에 이것에 대해 읽을 수

: CAST는 변환 할 수 있습니다에게 SQLFiddle에서 테스트 데이터를 사용하여 CAST Function In Oracle

CLOBVARCHAR2 A와 :

SELECT CAST(clob_val AS VARCHAR2(100)) FROM t; 

결과 :

CAST(CLOB_VALASVARCHAR2(100)) 
----------------------------- 
clob1 
clob2

을 하지만 우리는 다른 방향으로는 할 수 없습니다. CLOBs 단지 지원되지 않습니다

SELECT CAST(vc_val AS CLOB) FROM t; 
> 00932. 00000 - "inconsistent datatypes: expected %s got %s"
3
CREATE OR REPLACE TYPE t_clob_tab as table of clob; 

declare 
    l_clob_tab t_clob_tab; 
begin 
    -- collect some data as clobs into a nested table 
    select 
    cast(multiset(
     select to_clob(object_name) 
     from dba_objects 
     where rownum <= 10) 
    as t_clob_tab) 
    into l_clob_tab 
    from dual; 

    -- show the data 
    for i in 1 .. l_clob_tab.count 
    loop 
     dbms_output.put_line('Clob' || i || ' Value is: ' || l_clob_tab(i)); 
    end loop; 

end; 

출력 :

CAST가 직접 지원하지 않습니다 : LOB 유형에 대한 CAST 기능 지원에 관해서는

Clob1 Value is: C_OBJ# 
Clob2 Value is: I_OBJ# 
Clob3 Value is: TAB$ 
Clob4 Value is: CLU$ 
Clob5 Value is: C_TS# 
Clob6 Value is: I_TS# 
Clob7 Value is: C_FILE#_BLOCK# 
Clob8 Value is: I_FILE#_BLOCK# 
Clob9 Value is: C_USER# 
Clob10 Value is: I_USER# 

LOB 데이터 유형 중 하나. CAST를 사용하여 CLOB 값을 문자 데이터 형식으로 변환하거나 BLOB 값을 RAW 데이터 형식으로 변환하면 데이터베이스는 암시 적으로 LOB 값을 문자 또는 원시 데이터로 변환 한 다음 결과로 값을 대상에 명시 적으로 캐스팅합니다 데이터 형식. 결과 값이 대상 유형보다 큰 경우, 데이터베이스는 오류를 리턴합니다.

이것은 CLOB -> Varchar에서 변환하는 것을 의미하는 것으로 보입니다. 그러나 이미 Clob을 가지고 있다면 컬렉션 (이 경우에는 중첩 테이블)에 넣을 수 있어야합니다.

저는 일반적으로 COLLECT 대신 CAST + MULTISET을 사용합니다. 더 쉽고 까다 롭다고 생각합니다. 나는 당신의 문제가 여기에 COLLECT + CAST가 있다고 생각하는데, CAST 자체가 아니라 (NUMBER 정밀도와 비슷한 문제).

EDIT : 간단한 선택에서 오류없이 사용할 수 있지만 Collect 함수를 사용하여 제안을 제거했습니다. pl/sql에서 사용할 수 없습니다.또한, (SQL 또는 PL/SQL) 위의 CAST + MULTISET 옵션 이외에, 당신은 (PL/SQL에서 어쨌든) 간단하게 수행 할 수 있습니다

select clob_col 
bulk collect into l_clob_tab 
from t; 

희망.

+0

'CLOB' 매개 변수로'COLLECT'를 사용할 수 없으며,'00932 '를 던집니다. 00000 - "일치하지 않는 데이터 유형 : 예상되는 % s에 % s"오류가 있습니다. 적어도 그것은 나를 위해 작동하지 않습니다 ... +1 MULTISET 접근법. –

+0

@PrzemyslawKruglej 감사합니다. 나는 CLOB과 함께 COLLECT를 사용할 수 있지만 CLOB로 CAST + COLLECT를 좋아하지 않는다. 정직해야하는 이유를 모르겠지만 CAST + COLLECT와 관련된 다른 문제가 있으므로 멀티 세트를 사용하지 말고 사용하십시오. – tbone

+0

사용중인 Oracle 버전은 무엇입니까? 나는 최신 11g 릴리즈 중 하나를 가지고 있습니다 ... 수집이 왜 저에게 효과가 없는지 궁금합니다. –

관련 문제