Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

CLOB so với VARCHAR2 và có những lựa chọn thay thế nào khác không?

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hàm COSH () trong Oracle

  2. Có cách nào, trong ORACLE, để nối nhiều dòng hàng thành một dòng duy nhất, sử dụng hai bảng, trong đó các giá trị cuối cùng được phân tách bằng dấu phẩy không?

  3. Khóa học về lỗi điều chỉnh hiệu suất Oracle PL / SQL

  4. ora-01406 Lỗi khi tìm nạp các giá trị bằng OCI

  5. Có thể xem các đặc quyền bảng người dùng Oracle mà không có đặc quyền DBA không?