Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

pl/sql का उपयोग करके बैच ऑपरेशन कैसे करें

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

प्रश्न

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 की अनुमति देता है। क्वेरी में।

आपको कामयाबी मिले। आपको इसकी आवश्यकता होगी। अपने आप को पैर में गोली मत मारो।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. QueryChangeDescription से RowId प्राप्त करें

  2. आउटपुट को क्षैतिज रूप से प्रदर्शित करने की क्वेरी

  3. Oracle और PHP का उपयोग करना:SQL डेवलपर में काम करता है लेकिन PHP फ़ाइल परिणाम ORA-00900:अमान्य कथन

  4. लिक्विबेस अद्यतन त्रुटि

  5. अनुवर्ती प्रश्न:Oracle तालिका में पंक्तियों की तुलना करें और मिलान पंक्तियों को अपडेट करें