Đó 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.
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