2011-04-20 20 views
10

Tôi đang sử dụng nhà phát triển chấm dứt và thực thể của DevArt cho ứng dụng của tôi. Tôi đã tạo các bảng bằng tính năng Entity-First.CLOB so với VARCHAR2 và có lựa chọn thay thế nào khác không?

Tôi nhận thấy rằng nhiều loại cột được đặt thành CLOB. Tôi chỉ có kinh nghiệm với máy chủ MySQL và Microsoft SQL, vì vậy tôi không chắc chắn về việc sử dụng CLOB cho ứng dụng. Tôi đã làm một số đọc, và phát hiện ra rằng CLOB là cho đoạn lớn dữ liệu.

Các câu hỏi là:

  1. Đang sử dụng CLOB đối với hầu hết các lĩnh vực, chẳng hạn như giới tính của người dùng (mà phải là một varchar (1)) hay tên đầy đủ, khả thi? Các bước để chuyển đổi một trường CLOB thành VARCHAR2 yêu cầu thả cột sau đó tạo lại nó, và là lỗi trong Trình thám hiểm Entity của DevArt, vì vậy tôi muốn tránh nó nếu có thể. Chỉnh sửa: Tôi vừa phát hiện ra rằng nếu bạn đặt độ dài tối đa cho trường chuỗi, nó sẽ tự động là VARCHAR2.

  2. Có bất kỳ sự tương đương nào đối với TINYTEXT trong Oracle không?

Trả lời

16

Đó là một ý tưởng rất tồi khi sử dụng kiểu dữ liệu CLOB cho cột cần phải là VARCHAR2 (1). Ngoài các chi phí (thực tế là tối thiểu, vì Oracle sẽ xử lý các CLOB nội tuyến là < 4000 ký tự như VARCHAR2), chúng ta nên luôn cố gắng sử dụng biểu diễn chính xác nhất dữ liệu của chúng ta trong lược đồ: đó là thực hành tốt.

Điều này thực sự có vẻ giống như một vấn đề với công cụ DevArt, hoặc có lẽ sự hiểu biết của bạn về cách sử dụng nó (không có hành vi phạm tội). Nên có một số cách để bạn chỉ định kiểu dữ liệu của thuộc tính của một thực thể và/hoặc một cách ánh xạ các đặc tả đó tới các kiểu dữ liệu vật lý của Oracle. Tôi xin lỗi nếu điều này có vẻ hơi mơ hồ, tôi không phải là người quen với sản phẩm.


Vì vậy, đây là vấn đề cơ bản:

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> 

Chúng tôi có thể sửa chữa nó bằng cách sử dụng DDL để làm thay đổi cấu trúc bảng. Bởi vì lược đồ có nhiều cột như vậy nên đáng tự động hóa quá trình này. Hàm này xóa cột hiện tại và tái tạo nó dưới dạng VARCHAR2. Nó cung cấp tùy chọn di chuyển dữ liệu trong cột CLOB sang cột VARCHAR2; bạn có thể không cần điều này, nhưng nó ở đó để hoàn thành. (Đây không phải là sản xuất mã chất lượng - nó cần xử lý lỗi, quản lý hạn chế NOT NULL, vv)

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; 
/

Vì vậy, chúng ta hãy thay đổi cột đó ...

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

PL/SQL procedure successfully completed. 

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

SQL> 

Gọi thủ tục này có thể được tự động hoặc theo kịch bản theo cách thông thường.

+0

Tôi vẫn còn mới đối với công cụ, được cấp. Tôi nhận ra quá muộn rằng có thể chỉ định kiểu dữ liệu bạn muốn cho trường trước khi bạn tạo cơ sở dữ liệu, nhưng tôi đã đặt trong nhiều giờ làm việc sau đó. – Extrakun

7

Sử dụng CLOB cho mục nào đó như một cột Gender sẽ ở mức tối thiểu, rất khác thường. Nếu DDL công cụ này tạo ra xác định rằng dữ liệu LOB phải được lưu trữ nội dòng chứ không phải là ngoài dòng, tôi sẽ không mong đợi được bất kỳ vấn đề hiệu suất khủng khiếp nào. Nhưng bạn có thể sẽ tạo ra các vấn đề cho các công cụ khác truy cập vào cơ sở dữ liệu mà không xử lý các LOB đặc biệt tốt.

Không có tương đương trong Oracle với Tinytext trong MySQL. CLOB là một CLOB.

4

Một giải pháp đơn giản hơn là vào Model Explorer -> Model.Store -> Tables/Views, tìm cột cần thiết và thay đổi loại trường này thành VARCHAR2.
Sau đó chạy trình hướng dẫn Cập nhật Cơ sở dữ liệu từ Mô hình để duy trì các thay đổi đối với cơ sở dữ liệu.
Đừng quên đặt khía cạnh MaxLength (tuy nhiên, vấn đề với nó đã được sửa trong bản dựng Beta sắp tới).

Các vấn đề liên quan