Merupakan ide yang sangat buruk untuk menggunakan tipe data CLOB untuk kolom yang seharusnya VARCHAR2(1). Terlepas dari overhead (yang sebenarnya minimal, karena Oracle akan memperlakukan CLOB inline <4000 karakter sebagai VARCHAR2), kita harus selalu berusaha untuk menggunakan representasi data kita yang paling akurat dalam skema:itu hanya praktik yang baik.
Ini benar-benar tampak seperti masalah dengan alat DevArt, atau mungkin pemahaman Anda tentang cara menggunakannya (jangan tersinggung). Seharusnya ada beberapa cara bagi Anda untuk menentukan tipe data atribut entitas dan/atau cara memetakan spesifikasi tersebut ke tipe data fisik Oracle. Saya minta maaf jika ini tampak agak kabur, saya tidak terbiasa dengan produk ini.
Jadi, ini adalah masalah dasarnya:
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>
Kita dapat memperbaikinya dengan menggunakan DDL untuk mengubah struktur tabel. Karena skema memiliki banyak kolom seperti itu, proses otomatisasi bermanfaat. Fungsi ini menghapus kolom yang ada dan membuatnya kembali sebagai VARCHAR2. Ini menawarkan opsi untuk memigrasikan data di kolom CLOB ke kolom VARCHAR2; Anda mungkin tidak membutuhkan ini, tapi itu ada untuk kelengkapan. (Ini bukan kode kualitas produksi - ini membutuhkan penanganan kesalahan, mengelola batasan NOT NULL, dll)
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;
/
Jadi, mari kita ubah kolom itu...
SQL> exec clob2vc ('T69', 'COL1', 1)
PL/SQL procedure successfully completed.
SQL> desc t69
Name Null? Type
----------------------------------------- -------- ---------------
COL1 VARCHAR2(1)
SQL>
Memanggil prosedur ini dapat diotomatisasi atau ditulis dengan cara biasa.