2009-06-22 6 views
32

मैं कुछ ओरेकल काम करने में एक सहयोगी के लिए भरने की कोशिश कर रहा हूं, और एक झगड़ा में भाग गया। नल के लिए एक स्तंभ संशोधित करने के लिए एक पटकथा लिखने के लिए प्रयास कर में, मैं सुंदर ORA-01451 त्रुटि का सामना किया:ऑरैकल में संशोधित कॉलम - कैसे जांचें कि कॉलम शून्य करने के लिए सेट करने से पहले शून्य है?

ORA-01451: column to be modified to NULL cannot be modified to NULL 

इसका कारण यह है स्तंभ पहले से ही शून्य है हो रहा है। हमारे पास कई डेटाबेस हैं जिन्हें उतारने की आवश्यकता है, इसलिए मेरी ग़लत धारणा में मैंने यह सुनिश्चित करने के लिए बोर्ड में काम करना चाहिए कि यह सुनिश्चित करने के लिए कि सभी लोग अद्यतित हैं, भले ही वे इस कॉलम को मैन्युअल रूप से सेट करने के लिए सेट करें या नहीं। हालांकि, यह स्पष्ट रूप से कुछ लोगों के लिए एक त्रुटि का कारण बनता है जिनके पास कॉलम पहले से ही शून्य है।

त्रुटि से बचने के लिए कोई कॉलम पहले से ही शून्य होने पर कैसे जांचता है? कुछ है कि इस विचार को पूरा होगा:

IF(MyTable.MyColumn IS NOT NULLABLE) 
    ALTER TABLE MyTable MODIFY(MyColumn NULL); 

उत्तर

41

आप PL/SQL में ऐसा कर सकता है:

declare 
    l_nullable varchar2(1); 
begin 
    select nullable into l_nullable 
    from user_tab_columns 
    where table_name = 'MYTABLE' 
    and column_name = 'MYCOLUMN'; 

    if l_nullable = 'N' then 
    execute immediate 'alter table mytable modify (mycolumn null)'; 
    end if; 
end; 
+0

धन्यवाद टोनी! मुझे यह काम मिल रहा है (निष्पादन पर उद्धरण को बंद करने के लिए एक मामूली फिक्स के साथ) और अब हम व्यवसाय में हैं! –

+0

मैं सुझाव दूंगा कि प्रत्येक बार जब आप इसे चलाते हैं तो डाटा डिक्शनरी से पूछताछ करना अपर्याप्त होगा, अगर ऐसा होता है तो अपवाद को संभालने की तुलना में। –

+0

जेफरी, आप शायद सही हैं, लेकिन यह स्कीमा चेंज स्क्रिप्ट के लिए था, इसलिए यह प्रति डेटाबेस एक बार-बार स्थिति है। एक बार परिवर्तन हो जाने के बाद, यह फिर से नहीं चलाया जाएगा। –

19

बस बदलने की मेज करते हैं और अपवाद को पकड़ने के।

DECLARE 
    allready_null EXCEPTION; 
    PRAGMA EXCEPTION_INIT(allready_null, -1451); 
BEGIN 
    execute immediate 'ALTER TABLE TAB MODIFY(COL NULL)'; 
EXCEPTION 
    WHEN allready_null THEN 
     null; -- handle the error 
END; 
/

आप PL/SQL का उपयोग नहीं करना चाहते हैं, तो

set feedback off 
    set echo off 
    set feedback off 
    set pages 0 
    set head off 

    spool to_null.sql 

    select 'alter table TAB modify (COL NULL);' 
    from user_tab_columns 
    where table_name = 'TAB' 
    and column_name = 'COL' 
    and nullable = 'N'; 

    spool off 
    set feedback on 
    set echo on 
    set termout on 
    @@to_null.sql 
    host rm -f to_null.sql 

या बस बदलने की मेज करते हैं और त्रुटि को अनदेखा।

+0

+1 "पकड़ अपवाद अगर यह विफल रहता है" दृष्टिकोण के लिए, जो हर बार –

+1

डेटा शब्दकोष पूछने से अधिक कुशल है, बस यह जोड़ना चाहते हैं कि यह दृष्टिकोण PLSQL – Rene

+1

में बहुत व्यापक रूप से उपयोग किया जाता है 'होस्ट आरएम-एफ to_null.sql' (* nix) या 'होस्ट del/f to_null.sql' अस्थायी फ़ाइलों के साथ निर्देशिका को कूड़ेदान से बचने के लिए। –