Oracle
 sql >> Baza danych >  >> RDS >> Oracle

CLOB vs. VARCHAR2 i czy są inne alternatywy?

Bardzo złym pomysłem jest użycie typu danych CLOB dla kolumny, która powinna być VARCHAR2(1). Oprócz kosztów ogólnych (które są w rzeczywistości minimalne, ponieważ Oracle będzie traktować wbudowane obiekty CLOB o długości <4000 znaków jako VARCHAR2), powinniśmy zawsze dążyć do jak najdokładniejszej reprezentacji naszych danych w schemacie:to po prostu dobra praktyka.

To naprawdę wydaje się być problemem z narzędziem DevArt lub być może twoim zrozumieniem, jak z niego korzystać (bez obrazy). Powinien istnieć jakiś sposób na określenie typu danych atrybutu jednostki i/lub sposób odwzorowania tych specyfikacji na fizyczne typy danych Oracle. Przepraszam, jeśli wydaje się to trochę niejasne, nie znam produktu.

Oto podstawowy problem:

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>

Możemy to naprawić, używając DDL do zmiany struktury tabeli. Ponieważ schemat ma wiele takich kolumn warto zautomatyzować proces. Ta funkcja usuwa istniejącą kolumnę i odtwarza ją jako VARCHAR2. Oferuje opcję migracji danych z kolumny CLOB do kolumny VARCHAR2; prawdopodobnie nie potrzebujesz tego, ale jest tam dla kompletności. (To nie jest kod jakości produkcyjnej - wymaga obsługi błędów, zarządzania ograniczeniami NOT NULL itp.)

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;
/

Zmieńmy więc tę kolumnę...

SQL> exec clob2vc ('T69', 'COL1', 1)

PL/SQL procedure successfully completed.

SQL> desc t69
 Name                                      Null?    Type
 ----------------------------------------- -------- ---------------
 COL1                                               VARCHAR2(1)

SQL>

Wywołanie tej procedury można zautomatyzować lub oskryptować w zwykły sposób.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wyjątek połączenia ODP.NET

  2. Jak zalogować się do bazy danych Oracle?

  3. Jak sprawdzić format daty sesji Oracle

  4. Aktualizowanie tabeli Oracle z makra Excel VBA przy użyciu połączenia ODBC

  5. Dlaczego zapytanie Oracle 12c wymaga podwójnych cudzysłowów wokół tabeli?