Việc sử dụng kiểu dữ liệu CLOB cho cột phải là VARCHAR2 (1) là một ý tưởng rất tồi. Ngoài chi phí chung (thực sự là tối thiểu, vì Oracle sẽ coi các CLOB nội tuyến <4000 ký tự là VARCHAR2), chúng ta nên luôn cố gắng sử dụng cách trình bày dữ liệu chính xác nhất của chúng ta trong lược đồ:đó chỉ là một phương pháp hay.
Điều này thực sự có vẻ như là một vấn đề với công cụ DevArt hoặc có thể là hiểu biết của bạn về cách sử dụng nó (không xúc phạm). Phải 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 cách ánh xạ các thông số kỹ thuật đó với 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 quen thuộc với sản phẩm này.
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 ta có thể sửa nó bằng cách sử dụng DDL để thay đổi cấu trúc bảng. Vì lược đồ có nhiều cột như vậy nên việc tự động hóa quá trình là rất đáng giá. Hàm này loại bỏ cột hiện có và tạo lại 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 cái này, nhưng nó ở đó để hoàn thiện. (Đây không phải là mã chất lượng sản xuất - nó cần xử lý lỗi, quản lý các ràng buộc NOT NULL, v.v.)
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, 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>
Việc gọi thủ tục này có thể được tự động hóa hoặc được viết kịch bản theo những cách thông thường.