2011-06-24 10 views
6

यह DBI मैनुअल से मानक डालने वाला उदाहरण है:पर्ल डीबीआई: बाध्य मूल्यों के साथ असफल क्वेरी कैसे देखें?

  my $query = q{ 
     INSERT INTO sales (product_code, qty, price) VALUES (?, ?, ?) 
    }; 
    my $sth = $dbh->prepare($query) or die $dbh->errstr; 
    while (<>) { 
     chomp; 
     my ($product_code, $qty, $price) = split /,/; 
     $sth->execute($product_code, $qty, $price) or die ($query . " " . $dbh->errstr); 
    } 
    $dbh->commit or die $dbh->errstr; 

मैंने इसे थोड़ा सा संशोधित किया है, इसलिए मैं मरने पर देख सकता हूं कि कौन सी क्वेरी विफल हुई (die ($query . " " . $dbh->errstr))। फिर भी मुझे क्वेरी को (जैसा कि इसे निष्पादित किया गया था) के साथ क्वेरी देखना पसंद आया था। इसे कैसे प्राप्त करें?


btw संपादित करें, मुझे बाध्य मानों के साथ क्वेरी देखने के लिए एक अजीब तरीका भी मिला: आपको क्वेरी में वाक्यविन्यास त्रुटि बनाना है। उदाहरण के लिए, यदि मैं उपर्युक्त क्वेरी को बदलता हूं:

  my $query = q{ 
     xINSERT INTO sales (product_code, qty, price) VALUES (?, ?, ?) 
    }; 

मुझे यह वापस मिला जैसा मैं चाहता था:

डीबीडी :: mysql :: st execute विफल: आपको अपने SQL वाक्यविन्यास में कोई त्रुटि है ; 'xINSERT INTO नमूना (product_code, qty, कीमत) VALUES (' 1 ',' 2 ',' 3 ')' लाइन 1

पर उपयोग करने के लिए सही वाक्यविन्यास के लिए आपके MySQL सर्वर संस्करण से संबंधित मैन्युअल जांचें

कभी-कभी यह वास्तव में मदद करता है। कम से कम यह मेरे साथ किया था।

उत्तर

3

पैरामीटर मान प्राप्त करने के लिए आप डीबीआई के ParamValues का उपयोग कर सकते हैं लेकिन एसक्यूएल में वास्तव में पैरामीटर प्राप्त करने के लिए आपको डीबीडी में कोई भी विधि खोजने की संभावना नहीं है क्योंकि SQL को पार्स किए जाने के बाद उन्हें ज्यादातर डेटाबेस में भेजा जाता है। त्रुटि संदेश हैंडलर में पैरामवेल का उपयोग कैसे किया जाता है यह देखने के लिए आप DBIx::Log4perl देख सकते हैं। आपको डीबीआईएक्स :: लॉग 4perl के कुछ हिस्सों को भी उपयोगी मिल सकता है।

+0

अच्छी दिशा इंगित करने के लिए धन्यवाद। फिर भी मैं ओपी में अपने जोड़ को इंगित करना चाहता हूं। –

0

ऐसा करने के लिए कोई सामान्य रूप से समर्थित डीबीआई तरीका नहीं है, मुझे लगता है, लेकिन व्यक्तिगत डेटाबेस ड्राइवर इसे अनुमति दे सकते हैं। आप किस डेटाबेस का उपयोग कर रहे हैं?

1

ऐसा करने का कोई मानक तरीका नहीं है। निकटतम अनुमान प्रत्येक प्लेसहोल्डर को (शायद उद्धृत) मूल्य से प्रतिस्थापित करना होगा। आम तौर पर, सीमित पहचानकर्ताओं या तारों या टिप्पणियों के बजाय प्लेसहोल्डर हैं जो प्रश्न चिह्नों को खोजने के लिए एसक्यूएल कथन को विश्वसनीय रूप से पार्स करना मुश्किल है। उदाहरण में, आप केवल प्रश्न चिह्नों की तलाश कर सकते हैं; कि हमेशा काम करेंगे नहीं है, हालांकि:

INSERT /* ? */ INTO "??".Sales VALUES('?', ?, ?, ?); 

ध्यान दें कि अधिकांश के साथ, लेकिन जरूरी नहीं कि सभी, डीबीएमएस (और इसलिए सबसे DBD ड्राइवरों), बयान डीबीएमएस जब यह तैयार किया जाता है करने के लिए भेज दिया जाता है नहीं; कथन निष्पादित होने पर केवल मान भेजे जाते हैं। VALUES सूची में प्रतिस्थापित सभी मूल्यों के साथ कभी भी एक बयान नहीं बनाया गया है, इसलिए न तो डीबीआई और न ही डीबीएमएस को एक बनाने की उम्मीद की जानी चाहिए।

संबंधित मुद्दे