मैं बस यह कहने जा रहा हूं कि शुरू करने से पहले यह स्थूल है। यदि आप स्क्रिप्ट बना रहे हैं जो डेटाबेस निर्माण को स्वचालित करता है, तो मैं नीचे दी गई क्वेरी को छोड़ दूंगा और बस कॉपी/पेस्ट के साथ जाऊंगा क्योंकि यह इतना भयानक है कि यह आपके डेटाबेस परिनियोजन स्क्रिप्ट में नहीं है।
प्रश्न
DECLARE
CURSOR TABLES IS SELECT * FROM USER_TABLES
WHERE 0 = (SELECT COUNT(*)
FROM USER_CONSTRAINTS
WHERE USER_CONSTRAINTS.TABLE_NAME = USER_TABLES.TABLE_NAME
AND USER_CONSTRAINTS.CONSTRAINT_TYPE = 'P'
);
BEGIN
FOR T IN TABLES LOOP
EXECUTE IMMEDIATE 'ALTER TABLE '||T.TABLE_NAME||' ADD ID NUMBER(12)';
EXECUTE IMMEDIATE 'CREATE SEQUENCE '||T.TABLE_NAME||'Seq START WITH 1';
EXECUTE IMMEDIATE 'UPDATE '||T.TABLE_NAME||' SET ID = '||T.TABLE_NAME||'Seq.NEXTVAL';
EXECUTE IMMEDIATE 'ALTER TABLE '||T.TABLE_NAME||' ADD PRIMARY KEY (ID)';
EXECUTE IMMEDIATE 'CREATE OR REPLACE TRIGGER '||T.TABLE_NAME||'PKSet '||CHR(10)
||'BEFORE INSERT ON '||T.TABLE_NAME||' '||CHR(10)
||'FOR EACH ROW '||CHR(10)
||'BEGIN '||CHR(10)
||':NEW.ID := '||T.TABLE_NAME||'Seq.NEXTVAL; '||CHR(10)
||'END; ';
END LOOP;
END;
/
यह क्या करता है?
मूल रूप से, यह तालिकाओं की एक सूची प्राप्त करता है और इसमें शामिल विभिन्न कार्यों को करने के लिए गतिशील रूप से SQL बनाता है। EXECUTE IMMEDIATE
स्ट्रिंग लेता है जहां हमने एसक्यूएल बनाया और इसे निष्पादित किया। CHR(10)
कुरूपता एक नई रेखा है। मैं वहां व्हाइटस्पेस चाहता था क्योंकि मुझे नहीं पता कि इसे कैसे छोड़ना ओरेकल के पार्सिंग को प्रभावित करेगा। ध्यान दें कि कई जगहों पर हम अनुक्रम या पीके बाधा नाम उत्पन्न करने के लिए तालिका नाम को सीधे किसी अन्य टेक्स्ट से जोड़ते हैं।
यदि आपने निर्माण के दौरान अपने टेबल नामों को उद्धृत किया है और कुछ लोअर केस वर्णों का उपयोग कर रहे हैं तो यह त्रुटि हो भी सकती है और नहीं भी। यदि यह त्रुटि करता है, तो ध्यान रखें कि प्रत्येक कथन में एक प्रतिबद्धता शामिल होती है। एक त्रुटि का मतलब होगा कि प्रक्रिया आधी हो गई है। यह भी विफल रहता है यदि स्कीमा वर्तमान उपयोगकर्ता नहीं है। (आपको USER_TABLES
बदलने की आवश्यकता होगी करने के लिए ALL_TABLES
और जहां क्लॉज में एक उपयुक्त फ़िल्टर जोड़ें और SQL को किसी अन्य स्कीमा पर काम करने के लिए बनाते समय तालिका नाम के सामने स्कीमा जोड़ें।)
एक वास्तविक कार्यशील SQLFiddle:http://sqlfiddle.com/#!4/b67fc/1ए> (मुझे विश्वास नहीं हो रहा है कि यह वास्तव में SQLFiddle पर काम करता है।) इस मामले में, जिस क्वेरी में हम रुचि रखते हैं वह स्कीमा परिभाषा में समाप्त हो गई है क्योंकि SQL Fiddle केवल SELECT
की अनुमति देता है। क्वेरी में।
आपको कामयाबी मिले। आपको इसकी आवश्यकता होगी। अपने आप को पैर में गोली मत मारो।