2011-04-20 6 views
10

내 응용 프로그램에 DevArt의 dotConnect 및 Entity Developer를 사용하고 있습니다. Entity-First 기능을 사용하여 테이블을 만들었습니다.CLOB vs. VARCHAR2 그리고 다른 대안이 있습니까?

많은 열 유형이 CLOB로 설정됩니다. MySQL과 Microsoft SQL 서버에 대한 경험이 있기 때문에 CLOB를 사용하는 것에 대해 확신하지 못합니다. 나는 약간의 독서를했고, CLOB가 많은 양의 데이터를위한 것이라는 사실을 알아 냈습니다.

질문은 다음과 같습니다

  1. 는 가능 또는 전체 이름 (A VARCHAR (1)이어야 함) 사용자의 성별 등의 대부분의 필드 CLOB를 사용? CLOB 필드를 VARCHAR2로 변환하는 단계는 열을 삭제 한 다음 다시 작성해야하며 DevArt의 Entity Explorer에서 버그가 있으므로 가능하면 피하고 싶습니다. 편집 : 문자열 필드의 최대 길이를 설정하면 자동으로 VARCHAR2가됩니다.

  2. Oracle에서 TINYTEXT에 해당하는 항목이 있습니까?

답변

16

VARCHAR2 (1)이되어야하는 열에 CLOB 데이터 유형을 사용하는 것은 매우 나쁜 생각입니다. 오라클은4000 문자의 인라인 CLOB를 VARCHAR2로 처리하므로 오히려 오버 헤드를 제외하고 스키마에서 데이터를 가장 정확하게 표현하기 위해 노력해야합니다. 이는 단지 좋은 습관 일뿐입니다.

이것은 실제로 DevArt 도구의 문제이거나 사용법에 대한 이해 (불쾌감 없음)처럼 보입니다. 엔티티 속성의 데이터 유형 및/또는 오라클의 물리적 데이터 유형에 이러한 스펙을 매핑하는 방법을 지정하는 방법이 있어야합니다. 조금 애매한 것 같아 사과드립니다. 제품에 익숙하지 않습니다.

SQL> desc t69 
Name          Null? Type 
----------------------------------------- -------- -------- 
COL1            CLOB 

SQL> 
SQL> alter table t69 modify col1 varchar2(1) 
    2/
alter table t69 modify col1 varchar2(1) 
         * 
ERROR at line 1: 
ORA-22859: invalid modification of columns 


SQL> 

우리는 테이블 구조를 변경하는 DDL을 사용하여 문제를 해결할 수 있습니다


그래서,이 기본적인 문제입니다. 스키마에는 이러한 열이 많기 때문에 프로세스를 자동화하는 것이 좋습니다. 이 함수는 기존 열을 삭제하고이를 VARCHAR2로 다시 작성합니다. CLOB 컬럼의 데이터를 VARCHAR2 컬럼으로 이주하는 옵션을 제공합니다. 당신은 아마 이것을 필요로하지 않지만, 완벽을 위해 거기에 있습니다. (이것은 생산 품질 코드가 아닙니다 - 그것은 NULL NOT 제약 조건을 관리하는 오류 처리 등이 필요),이 프로 시저를 호출

SQL> exec clob2vc ('T69', 'COL1', 1) 

PL/SQL procedure successfully completed. 

SQL> desc t69 
Name          Null? Type 
----------------------------------------- -------- --------------- 
COL1            VARCHAR2(1) 

SQL> 

을 자동화 할 수 있습니다 ...의 그 열을 변경할 수 그래서

create or replace procedure clob2vc 
    (ptab in user_tables.table_name%type 
    , pcol in user_tab_columns.column_name%type 
    , pcol_size in number 
    , migrate_data in boolean := true) 
is 
begin 
    if migrate_data 
    then 
     execute immediate 'alter table '||ptab 
        ||' add tmp_col varchar2('|| pcol_size|| ')'; 
     execute immediate    
        'update '||ptab 
        ||' set tmp_col = substr('||pcol||',1,'||pcol_size||')'; 
    end if; 
    execute immediate 'alter table '||ptab 
       ||' drop column '|| pcol; 

    if migrate_data 
    then 
     execute immediate 'alter table '||ptab 
        ||' rename column tmp_col to '|| pcol; 
    else 
     execute immediate 'alter table '||ptab 
        ||' add '||pcol||' varchar2('|| pcol_size|| ')'; 
    end if; 
end; 
/

또는 일반적인 방법으로 스크립트.

+0

나는이 도구에 아직 익숙하지 않다. 나는 당신이 데이터베이스를 생성하기 전에 필드에 대해 원하는 데이터 유형을 지정할 수 있다는 것을 너무 늦게 깨닫는다. 그러나 나는 이미 그때까지 많은 시간을 투자했다. – Extrakun

7

Gender 열 같은위한 CLOB를 사용하면, 최소한 매우 특이한 것이다. 이 도구가 생성하는 DDL에서 LOB 데이터가 라인 외가 아닌 인라인으로 저장되어야한다고 지정하면, 성능에 대한 끔찍한 문제는 없을 것입니다. 그러나 LOB를 특히 잘 처리하지 못하는 데이터베이스에 액세스하는 다른 도구에 문제가 발생할 수 있습니다.

MySQL에는 Tinytext과 동등한 Oracle이 없습니다. CLOB는 CLOB입니다.

4

더 간단한 해결 방법은 모델 탐색기 -> Model.Store -> Tables/Views로 이동하여 필요한 열을 찾고이 필드의 유형을 VARCHAR2로 변경하는 것입니다.
그런 다음 모델에서 데이터베이스 업데이트 마법사를 실행하여 변경 내용을 데이터베이스에 유지하십시오.
MaxLength 패싯을 설정하는 것을 잊지 마십시오 (단,이 문제는 곧 출시 될 베타 빌드에서 수정 됨).

관련 문제