2009-03-12 10 views
14

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

यह एसक्यूएल सर्वर में इस के समान होगा: नहीं मौजूद है (का चयन करें * SYSINDEXES से जहां नाम = 'myIndex') // तब मेरे myIndex जहां INDEX_NAME user_indexes से

उत्तर

30

चयन गिनती (*) बनाने = 'myIndex'

sqlplus IF का समर्थन नहीं करेगा ..., हालांकि, आपको अज्ञात पीएल/एसक्यूएल ब्लॉक का उपयोग करना होगा, जिसका अर्थ है डीडीएल करने के लिए तत्काल तत्काल।

DECLARE 
    i INTEGER; 
BEGIN 
    SELECT COUNT(*) INTO i FROM user_indexes WHERE index_name = 'MYINDEX'; 
    IF i = 0 THEN 
     EXECUTE IMMEDIATE 'CREATE INDEX myIndex ...'; 
    END IF; 
END; 
/

संपादित करें: के रूप में कहा, ओरेकल भंडार सभी अपरकेस में गैर उद्धृत वस्तु के नाम।

+1

जब तक आप उन्हें उद्धृत न करें, डेटाबेस ऑब्जेक्ट्स (इंडेक्स सहित) को अपरकेस में संग्रहीत किया जाता है। तो यदि आप CREATE INDEX myIndex बनाते हैं, तो USER_INDEXES में इसे MYINDEX के रूप में संग्रहीत किया जाएगा। और ओरेकल (डिफ़ॉल्ट रूप से) केस असंवेदनशील मैचों नहीं करेगा। –

+1

बस इस उत्तर के अतिरिक्त: यदि आपको यह जांचने की आवश्यकता है कि कोई अन्य स्कीमा में कोई अनुक्रमणिका मौजूद है, तो USER_INDEXES का उपयोग करने के बजाय ALL_INDEXES क्वेरी करें। USER_INDEXES की जांच करना "वैकल्पिक सत्र SET CURRENT_SCHEMA = XYZ" के साथ काम नहीं करता है, फिर भी आप वर्तमान में लॉग इन उपयोगकर्ता के लिए इंडेक्स से पूछेंगे। – SaschaM78