Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

CLOB बनाम VARCHAR2 और क्या अन्य विकल्प हैं?

एक कॉलम के लिए CLOB डेटाटाइप का उपयोग करना बहुत बुरा विचार है जो VARCHAR2 (1) होना चाहिए। ओवरहेड्स के अलावा (जो वास्तव में न्यूनतम हैं, क्योंकि Oracle <4000 वर्णों के इनलाइन CLOB को VARCHAR2 के रूप में मानेगा) हमें हमेशा स्कीमा में अपने डेटा के सबसे सटीक प्रतिनिधित्व का उपयोग करने का प्रयास करना चाहिए:यह सिर्फ अच्छा अभ्यास है।

यह वास्तव में DevArt टूल, या शायद इसका उपयोग करने की आपकी समझ (कोई अपराध नहीं) के साथ एक समस्या की तरह लगता है। आपके लिए किसी इकाई की विशेषता के डेटाटाइप को निर्दिष्ट करने का कोई तरीका होना चाहिए और/या उन विनिर्देशों को ओरेकल के भौतिक डेटाटाइप में मैप करने का एक तरीका होना चाहिए। अगर यह थोड़ा अस्पष्ट लगता है, तो मैं क्षमा चाहता हूं, मैं उत्पाद से परिचित नहीं हूं।

तो, यह मूल समस्या है:

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>

हम टेबल संरचना को बदलने के लिए डीडीएल का उपयोग करके इसे ठीक कर सकते हैं। चूंकि स्कीमा में ऐसे कई कॉलम हैं, इसलिए प्रक्रिया को स्वचालित करना सार्थक है। यह फ़ंक्शन मौजूदा कॉलम को छोड़ देता है और इसे VARCHAR2 के रूप में पुन:बनाता है। यह CLOB कॉलम में डेटा को VARCHAR2 कॉलम में माइग्रेट करने का विकल्प प्रदान करता है; आपको शायद इसकी आवश्यकता नहीं है, लेकिन यह पूर्णता के लिए है। (यह उत्पादन गुणवत्ता कोड नहीं है - इसे त्रुटि प्रबंधन की आवश्यकता है, नल बाधाओं का प्रबंधन, आदि)

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

तो चलिए उस कॉलम को बदलते हैं...

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

PL/SQL procedure successfully completed.

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

SQL>

इस प्रक्रिया को कॉल करना सामान्य तरीकों से स्वचालित या स्क्रिप्टेड किया जा सकता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle के लिए एंटिटी फ्रेमवर्क संगत प्रदाताओं की तुलना?

  2. ओरेकल डीबी डुप्लिकेट कुंजी अपडेट के बराबर है

  3. शीर्ष n प्रतिशत शीर्ष n%

  4. Oracle में सरल पुनरावर्ती क्वेरी

  5. एलडीएपी:खाली बाइंडन और प्रमाणीकरण प्रकार किसी से भी सरल नहीं हो जाता है