Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

CLOB vs. VARCHAR2 dan apakah ada alternatif lain?

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana Mengembalikan ResultSet dari Stored Procedure di Oracle?

  2. Bagaimana cara memotong semua tabel pengguna?

  3. Memuat Data Gambar ke Kolom BLOB di Oracle

  4. Permintaan kendala Oracle setelah nilai search_condition

  5. SQL, Saat menghapus kaskade dan saat memperbarui kaskade