2010-07-05 15 views
8

क्या डीबीआई तैयार कथन पर उपयोग किए जाने का पुन: उपयोग करने का कोई तरीका है। निम्नलिखित कोड पर विचार करें:पुन: उपयोग करना? डीबीआई पर


$sth=$dbh->prepare("INSERT INTO mytable(a,b,c) SELECT ?,B(?),C(?)"); 
$sth->execute($a,$a,$a); 

यह बजाय कुछ इस तरह उपयोग करने के लिए बहुत अच्छा होगा:


#I'm making this up as something I hope exists 
$sth=$dbh->prepare("INSERT INTO mytable(a,b,c) SELECT ?,B(?:1),C(?:1)"); 
$sth->execute($a); 

सूचना है कि केवल एक $a बजाय निष्पादित तीन में भेजा जाता है। क्या वास्तविक जीवन में ऐसा करने का कोई तरीका है?

+3

कृपया गैर-चर के रूप में '$ a' (और' $ b') का उपयोग न करें। वे विशेष और विशेष रूप से परिभाषित हैं: http://perldoc.perl.org/perlvar.html#%24a – pilcrow

उत्तर

7

यह अपने DBD पर निर्भर करता है:

वैकल्पिक रूप से आप सिर्फ कोड की कुछ लाइनों के साथ कुछ ऐसा ही कर सकते हैं। उदाहरण के लिए, $1 प्लेसहोल्डर्स की शैली, या डीबीडी :: ओरेकल नामित प्लेसहोल्डर्स और bind_param के साथ डीबीडी :: पीजी का उपयोग करके, आप वही कर सकते हैं जो आपको पसंद है। लेकिन सामान्य उद्देश्य ? प्लेसहोल्डर्स की शैली का उपयोग करना जो डीबीआई-चौड़ा काम करता है, यह संभव नहीं है।

4

यदि आप अपने SQL स्टेटमेंट जेनरेट करने के लिए लाइब्रेरी का उपयोग करते हैं, उदा। SQL::Abstract या DBIx::Class जैसे पूर्ण ओआरएम, आपको इस तरह की चीजों के बारे में चिंता करने की आवश्यकता नहीं होगी।

my $sql = 'INSERT INTO ...blah blah... VALUES (' . (join(', ', ('?') x scalar(@insert_elements))) . ')'; 
+1

इन सभी समाधानों को तीन बार '$ a' टाइप करने की आवश्यकता होगी, जो मुझे विश्वास है कि एकमात्र कार्य उपयोगकर्ता 1 से बचने का प्रयास कर रहा है । –

+0

@ बिपाडल: कोई बाध्य पैरामीटर को '(($ ए) x 3 के रूप में पारित कर सकता है)'। – Ether

+0

हां, 'x' ऑपरेटर को वर्कअराउंड के रूप में उपयोग किया जा सकता है, लेकिन यह उसमें बदलाव नहीं करता है 1) ओपी ने पूछा कि क्या एक बार एक चर में पास करने का तरीका है और यह कई प्लेसहोल्डर्स से बंधे हैं और 2)' एक्स 'ऑपरेटर प्रत्येक प्लेसहोल्डर के लिए एक बार वैरिएबल में गुजरता है, जो सवाल टालना चाहता है। –

3

@ हॉब्स 'answer सही है - डिफ़ॉल्ट डीबीआई प्लेसहोल्डर इसे नहीं कर सकते हैं। @ ईथर का answer सही है - एक एसक्यूएल अमूर्तता यह एक गैर-मुद्दा बना सकता है।

हालांकि, आम तौर पर एक बार प्रत्येक विशिष्ट पैरामीटरयुक्त मूल्य को बांधने की आवश्यकता होती है।

my $sth = $dbh->prepare(<<'__eosql'); 
    INSERT INTO mytable(a,b,c) 
       SELECT x, B(x), C(x) FROM (SELECT ? AS x) subq 
           -- Subquery may vary from DB to DB: 
           -- "FROM (SELECT ? AS x FROM DUAL) subq" 
           -- "FROM (SELECT ? FROM rdb$database) subq(x)" 
           -- "FROM (VALUES (?)) subq(x)" 
           -- etc. 
__eosql 

for $v (@values) { 
    $sth->execute($v); 
} 

आम तौर पर इस संवर्द्धित अधिक "तार कुशल" है विकल्प की तुलना में, उपयोगकर्ता के बाद से: अपने उदाहरण में, एक अदिश तालिका व्युत्पन्न का उपयोग कर उपयोगकर्ता के आपूर्ति मूल्य उपलब्ध नाम द्वारा क्वेरी का शेष भाग के लिए बनाता है -supplied पैरामीटर आमतौर पर एन बार के बजाय बस एक बार प्रेषित किया जाता है।

0

आप एक SQL कथन में SQL चर सेट कर सकते हैं और फिर उस क्वेरी को अगली क्वेरी में कई बार उपयोग कर सकते हैं।

$dbh->do('set @reusable = ?', undef, $perl_var); 
$dbh->select_arrayref('select * from table where cola = @reusable or colb = @reusable'); 

कोई डुप्लिकेट चर नहीं है और आपको अभी भी पैरामीटरयुक्त क्वेरी की सुरक्षा मिलती है।

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