ओरेकल एसक्यूएल में "EXT_" से शुरू होने वाली सभी तालिकाएं डीआरओपी करें

मुझे पता है कि यह सवाल कई बार पूछ सकता है लेकिन मुझे एक पंक्ति एसक्यूएल कथन नहीं मिला। मुझे याद है मैंने पहले किया था लेकिन अब मुझे याद नहीं आया कि मैंने कैसे किया

मैं उन सभी टेबलों को छोड़ना चाहता हूं जिनके नाम "EXT_" से शुरू होते हैं। क्या यह एक पंक्ति एसक्यूएल कथन के साथ ऐसा करने के लिए possibile है।

10
जोड़ा संपादित
विचारों: 1

4 उत्तर

ऐसा करने के लिए आप एक छोटे से अज्ञात ब्लॉक का उपयोग कर सकते हैं।

BEGIN
  FOR c IN ( SELECT table_name FROM user_tables WHERE table_name LIKE 'EXT_%' )
  LOOP
    EXECUTE IMMEDIATE 'DROP TABLE ' || c.table_name;
  END LOOP;
END;
26
जोड़ा
"कैस्केड बाधाएं" भी शामिल करें ताकि विदेशी टेबल शामिल होने पर उन तालिकाओं को छोड़ने का आदेश कोई मुद्दा नहीं होगा।
जोड़ा लेखक talek, स्रोत

केवल एक कथन के साथ यह संभव नहीं है। आम तौर पर, मैं सभी टेबल प्राप्त करने के लिए एक एसक्यूएल लिखता हूं और फिर परिणामों को निष्पादित करता हूं:

select 'drop table ' || table_name || ';'
from   user_tables
where  table_name like 'EXT_%';
6
जोड़ा
सभी को कॉपी करने और उन्हें निष्पादित करने के लिए इस के साथ आसान हो सकता है। 'ड्रॉप टेबल' का चयन करें || table_name || '; 'user_tables से जहां table_name' EXT_% 'जैसा है;
जोड़ा लेखक Ahmet Karakaya, स्रोत
हाँ, मेरा मतलब यही है। इस क्वेरी को निष्पादित करें, परिणामों को कॉपी/पेस्ट करें और कथन निष्पादित करें।
जोड़ा लेखक Alen Oblak, स्रोत

यह कोड न केवल EXT_% तालिकाओं को डीआरओपी करेगा, यह डीआरओपी एक्सटी% के रूप में भी कार्य करेगा। अंडरस्कोर विशेष वाइल्डकार्ड के रूप में है जो '%' के रूप में कार्य करता है लेकिन एक ही चरित्र के लिए।

BEGIN
  FOR c IN ( SELECT table_name FROM user_tables WHERE table_name LIKE 'EXT_%' )
  LOOP
    EXECUTE IMMEDIATE 'DROP TABLE ' || c.table_name;
  END LOOP;
END;

वांछित परिणाम प्राप्त करने के लिए आपको नीचे अपना रास्ता बदलना चाहिए

BEGIN
  FOR c IN ( SELECT table_name FROM user_tables WHERE table_name LIKE 'EXT\_%' ESCAPE '\')
  LOOP
    EXECUTE IMMEDIATE 'DROP TABLE ' || c.table_name;
  END LOOP;
END;

It escapes underscore char in order to be trated literally, ESCAPE '\' modifier indicates that escape char is '\'

2
जोड़ा

ज्यादातर मामलों में आपको उल्लंघन का उल्लंघन मिलेगा। उस स्थिति में, यह स्क्रिप्ट आपकी मदद कर सकती है:

DECLARE
   c_action CONSTANT VARCHAR2(10) := 'DROP';
BEGIN
  FOR c IN ( SELECT table_name FROM user_tables WHERE table_name LIKE 'STARTINGTEXT_%' )
  LOOP

       FOR reg IN (SELECT uc.table_name,
                      uc.constraint_name
                 FROM user_constraints uc
                WHERE uc.table_name IN (c.table_name)) LOOP
          EXECUTE IMMEDIATE 'ALTER TABLE ' || reg.table_name || ' ' || c_action ||
                        ' CONSTRAINT ' || reg.constraint_name ;
          END LOOP;

  END LOOP;
COMMIT;  
  FOR c IN ( SELECT table_name FROM user_tables WHERE table_name LIKE 'STARTINGTEXT_%' )
  LOOP

          EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || c.table_name;
          EXECUTE IMMEDIATE  'DROP TABLE ' || c.table_name;
  END LOOP;

END;
1
जोड़ा