2011-06-15 16 views
33

ऑरैकल डीबी के लिए तालिका में कॉलम जोड़ने से पहले मैं एक साधारण जांच कैसे जोड़ूं? मैंने SQL को शामिल किया है जिसे मैं कॉलम जोड़ने के लिए उपयोग कर रहा हूं।पीएल/एसक्यूएल में किसी मौजूदा तालिका में जोड़ने से पहले कॉलम मौजूद है या नहीं?

ALTER TABLE db.tablename 
    ADD columnname NVARCHAR2(30); 

उत्तर

62

ओरेकल डेटाबेस में कॉलम के बारे में सभी मेटाडेटा निम्न में से किसी एक दृश्य का उपयोग करके सुलभ है।

user_tab_cols; - उपयोगकर्ता द्वारा स्वामित्व वाली सभी तालिकाओं के लिए

all_tab_cols; - उपयोगकर्ता के लिए सुलभ सभी टेबलों के लिए

dba_tab_cols; - डेटाबेस में सभी तालिकाओं के लिए।

तो, आप SCOTT.EMP तालिका में ADD_TMS की तरह एक स्तंभ की तलाश में और स्तंभ ही अगर यह मौजूद नहीं है जोड़ने कर रहे हैं, PL/SQL कोड इन पंक्तियों के साथ होगा ..

DECLARE 
    v_column_exists number := 0; 
BEGIN 
    Select count(*) into v_column_exists 
    from user_tab_cols 
    where column_name = 'ADD_TMS' 
     and table_name = 'EMP'; 
     --and owner = 'SCOTT --*might be required if you are using all/dba views 

    if (v_column_exists = 0) then 
     execute immediate 'alter table emp add (ADD_TMS date)'; 
    end if; 
end; 
/

यदि आप इसे एक स्क्रिप्ट (प्रक्रिया का हिस्सा नहीं) के रूप में चलाने की योजना बना रहे हैं, तो सबसे आसान तरीका स्क्रिप्ट में परिवर्तन आदेश शामिल करना होगा और स्क्रिप्ट के अंत में त्रुटियों को देखना होगा, मान लें कि आपके पास कोई स्टार्ट-एंड नहीं है स्क्रिप्ट ..

आप file1.sql है, तो

और जब स्क्रिप्ट चलाया जाता है, तो col2 मौजूद है, अन्य दो कॉलम तालिका में जोड़े जाएंगे और लॉग "col2" पहले से मौजूद है, यह त्रुटि दिखाएगा, इसलिए आपको ठीक होना चाहिए।

+1

कम अनुभवी ओरेकल लोगों के लिए, यदि आप कॉलम और टेबल नाम की तुलना के दोनों पक्षों को कास्ट करते हैं तो यह आपको कुछ परेशानी बचा सकता है: 'निचला (स्तंभ_नाम) = निचला (' mycol ') ' – mastaBlasta

6

आम तौर पर, मैं कुछ इस तरह के लिए एएनएसआई-92 मानक मेटा तालिकाओं की कोशिश कर सुझाव देंगे, लेकिन मैं अब देखते हैं कि Oracle इसका समर्थन नहीं करता।

-- this works against most any other database 
SELECT 
    * 
FROM 
    INFORMATION_SCHEMA.COLUMNS C 
    INNER JOIN 
     INFORMATION_SCHEMA.TABLES T 
     ON T.TABLE_NAME = C.TABLE_NAME 
WHERE 
    C.COLLATION_NAME = 'columnname' 
    AND T.TABLE_NAME = 'tablename' 

इसके बजाय, यह looks आप की तरह की तरह

-- Oracle specific table/column query 
SELECT 
    * 
FROM 
    ALL_TAB_COLUMNS 
WHERE 
    TABLE_NAME = 'tablename' 
    AND COLUMN_NAME = 'columnname' 

मुझे लगता है कि में क्षमा चाहते हैं मैं ऊपर सत्यापित करने के लिए एक Oracle उदाहरण नहीं है कुछ करने की जरूरत है। अगर यह काम नहीं करता है, तो कृपया मुझे बताएं और मैं इस पोस्ट को हटा दूंगा।

+3

या यह कोशिश करते हैं और अपवाद – Randy

+7

पकड़ने आप 'ALL_TAB_COLUMNS' डेटा शब्दकोश दृश्य क्वेरी हैं, तो आप' OWNER' पर एक विधेय शामिल करना चाहते हैं कॉलम एकाधिक स्कीमा में एक ही तालिका मौजूद है। यदि आप जानते हैं कि आप वर्तमान उपयोगकर्ता की स्कीमा में केवल टेबल में रुचि रखते हैं, तो आपको इसके बजाय 'USER_TAB_COLUMNS' दृश्य का उपयोग करना चाहिए। –

17

या, आप त्रुटि को अनदेखा कर सकते हैं:

declare 
    column_exists exception; 
    pragma exception_init (column_exists , -01430); 
begin 
    execute immediate 'ALTER TABLE db.tablename ADD columnname NVARCHAR2(30)'; 
    exception when column_exists then null; 
end; 
/
+0

अच्छा और साफ। धन्यवाद! –

+0

मीठा! क्या यह table_exists के लिए भी इस्तेमाल किया जा सकता है? –

+0

दुर्भाग्य से, कोई "table_exists" नहीं है। – grokster

संबंधित मुद्दे

 संबंधित मुद्दे