एक कॉलम के लिए 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>
इस प्रक्रिया को कॉल करना सामान्य तरीकों से स्वचालित या स्क्रिप्टेड किया जा सकता है।