2010-09-01 19 views
14

मैं एक MySQLstored प्रक्रिया में DROP TABLE IF EXISTS उपयोग करने के लिए कैसे जानना चाहता हूँ में मौजूद है उपयोग करने के लिए। मैं एक नहीं बल्कि लंबे mySQL संग्रहित प्रक्रिया है कि काम का एक समूह और फिर परिणाम के साथ एक अस्थायी तालिका लोड होगा लिख ​​रहा हूँ। हालांकि, मुझे यह काम करने में परेशानी हो रही है।कैसे ड्रॉप तालिका यदि एक MySQL संग्रहित प्रक्रिया

मैं अस्थायी तालिका बात करने के लिए कुछ तरीके देखा है। असल में, आप या तो अस्थायी तालिका बनाते हैं, उस पर काम करते हैं, और फिर इसे अंत में छोड़ देते हैं ... या यदि आप मौजूद हैं, तो इसे छोड़ दें, इसे बनाएं, और फिर अपना काम करें।

मैं इतना है कि आप हमेशा साफ की शुरू दूसरी विधि पसंद करते हैं, और यह मेज के अस्तित्व के लिए एक अंतर्निहित जांच है।

यह काम करता है:

DELIMITER// 
    DROP PROCEDURE IF EXISTS pTest// 
    CREATE PROCEDURE pTest() 
    BEGIN 
     CREATE TEMPORARY TABLE tblTest (
      OrderDate varchar(200) 
     ); 
     DROP TEMPORARY TABLE tblTest; 
    END// 
DELIMITER ; 
CALL pTest(); 

यह काम करता है:

DELIMITER// 
    DROP PROCEDURE IF EXISTS pTest// 
    CREATE PROCEDURE pTest() 
    BEGIN 
     DROP TEMPORARY TABLE tblTest; 
     CREATE TEMPORARY TABLE tblTest (
      OrderDate varchar(200) 
     ); 
    END// 
DELIMITER ; 
CALL pTest(); 

यहाँ मेरी उदाहरण हैं: लेकिन, मैं यह काम करने के लिए प्राप्त करने के लिए नहीं कर पा रहे यह नहीं करता है:

012,
DELIMITER// 
    DROP PROCEDURE IF EXISTS pTest// 
    CREATE PROCEDURE pTest() 
    BEGIN 
     DROP TEMPORARY TABLE IF EXISTS tblTest; 
     CREATE TEMPORARY TABLE tblTest (
      OrderDate varchar(200) 
     ); 
    END// 
DELIMITER ; 
CALL pTest(); 

पहला 2 काम, लेकिन यदि वह तालिका मौजूद है (जैसे कि प्रक्रिया समाप्त नहीं हुई है या कुछ), तो यह स्पष्ट रूप से "टेबल tblTest मौजूद नहीं है" त्रुटि के साथ समाप्त होगा। गैर-कामकाजी उदाहरण वह है जो मैं ढूंढ रहा हूं - यदि वहां है तो तालिका को छोड़ दें और फिर इसे फिर से बनाएं ताकि मैं साफ़ कर सकूं।

यह लगता है जैसे यह "अगर मौजूद है" बनाने इस बात असफल है। मैंने सभी प्रकार की साइटों से कोड कॉपी किया है जो चीजों को बहुत समान करते हैं और किसी भी मामले में मुझे काम करने के लिए "ड्रोप टेबल अगर EXISTS ..." मिल सकता है। कभी।

देव सर्वर: सर्वर संस्करण: 5.1.47-समुदाय प्रॉड सर्वर: सर्वर संस्करण: 5.0.45-लॉग इन करें

हम डाटाबेस संस्करणों को बदल नहीं सकते (DBAs यह अनुमति नहीं दी जाएगी), इसलिए मैं जो कुछ भी कर रहा हूं उस पर अटक गया हूं। क्या यह mySQL में या प्रक्रिया में एक बग है?

धन्यवाद।

+0

मैं शायद वास्तविक त्रुटि है कि मैं पाने के पोस्ट किया है चाहिए ... [अं] 1064 - आप अपने एसक्यूएल वाक्य रचना में एक त्रुटि है, '// DELIMITER के पास उपयोग करने के लिए सही वाक्यविन्यास के लिए आपके MySQL सर्वर संस्करण से मेल खाने वाले मैन्युअल की जांच करें; कॉल pTest() 'लाइन 7 पर बस को हटाने "अगर मौजूद है" त्रुटि और पूरे proc काम करता है समाप्त, चल रहा है कि सटीक बयान मुझे एक ही त्रुटि देता है –

उत्तर

1

मैं क्यों यह आपके लिए काम नहीं कर रहा पता नहीं है, लेकिन आप एक हैंडलर जारी रखने का उपयोग कर समस्या के समाधान में सक्षम होना चाहिए। आप अपने आप BEGIN...END ब्लॉक में DROP TABLE बयान डालें, तो आप त्रुटि को अनदेखा करने हैंडलर जारी रखने के लिए उपयोग कर सकते हैं, तो तालिका मौजूद नहीं है।

इस प्रयास करें:

DELIMITER // 
    DROP PROCEDURE IF EXISTS pTest // 
    CREATE PROCEDURE pTest() 
    BEGIN 
     BEGIN 
     DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02' BEGIN END; 
     DROP TEMPORARY TABLE tblTest; 
     END; 
     CREATE TEMPORARY TABLE tblTest (
      OrderDate varchar(200) 
     ); 
    END // 
DELIMITER ; 
CALL pTest(); 
+0

(जब तक, ज़ाहिर है, तालिका मौजूद नहीं है) : [एरर] 1064 - आपको अपने SQL वाक्यविन्यास में कोई त्रुटि है; '// DELIMITER के पास उपयोग करने के लिए सही वाक्यविन्यास के लिए आपके MySQL सर्वर संस्करण से मेल खाने वाले मैन्युअल की जांच करें; लाइन 10 पर pTest() 'कॉल करें –

2

मैं भी यही समस्या थी। ऐसा लगता है कि MySQL यह जांचना पसंद नहीं करता कि तालिका कुछ संस्करणों या किसी चीज़ पर मौजूद है या नहीं। मैं इस मुद्दे के आसपास पहली डेटाबेस पूछताछ की काम किया, और अगर मैं एक मेज पाया मैं इसे गिरा दिया। का उपयोग करते हुए PHP:

$q = @mysql_query("SELECT * FROM `$name`"); 
if ($q){ 
    $q = mysql_query("DROP TABLE `$name`"); 
    if(!$q) die('e: Could not drop the table '.mysql_error()); 
} 

आप @ प्रतीक के साथ पहली क्वेरी में त्रुटि को दबाने, इसलिए आप किसी हस्तक्षेप त्रुटि नहीं है, और फिर जब क्वेरी झूठे रिटर्न तालिका ड्रॉप।

16

यह एक पुराने सवाल है, लेकिन यह आया के रूप में मैं के लिए ड्रॉप तालिका अगर मौजूद है देख रहा था।

आपका गैर-कार्य कोड मेरे MySQL 5.1.70 सर्वर पर काम नहीं करता है।

मुझे बस इतना करना था कि पहली पंक्ति पर DELIMITER और // के बीच एक जगह जोड़ दी गई थी, और सबकुछ ठीक काम करता था।

कार्य कोड:

DELIMITER // 
    DROP PROCEDURE IF EXISTS pTest// 
    CREATE PROCEDURE pTest() 
    BEGIN 
     DROP TEMPORARY TABLE IF EXISTS tblTest; 
     CREATE TEMPORARY TABLE tblTest (
      OrderDate varchar(200) 
     ); 
    END// 
DELIMITER ; 
संबंधित मुद्दे