2009-11-01 22 views
16

निम्नलिखित कोड एक भी गिनती मूल्य प्राप्त करने के लिए, बस बहुत ज्यादा हो रहा है। सादा डीबीआई का उपयोग कर एक एकल COUNT मूल्य लाने के लिए एक बेहतर, अनुशंसित तरीका है?मैं डीबीआई के साथ डेटाबेस से एक सिंगल गिनती मूल्य कैसे प्राप्त कर सकता हूं?

sub get_count { 
    my $sth = $dbh->prepare("SELECT COUNT(*) FROM table WHERE..."); 
    $sth->execute(@params); 
    my $($count) = $sth->fetchrow_array; 
    $sth->finish; 

    return $count; 
} 

यह कम है, लेकिन मैं अभी भी दो बयान है।

sub get_count_2 { 
    my $ar = $dbh->selectall_arrayref("SELECT ...", undef, @params) 
    return $ar->[0][0]; 
} 
+1

यह एक छोटे से व्यक्तिपरक है। कुछ लोग कहेंगे कि आपका लंबा उदाहरण अधिक पठनीय है। क्या हम पर्ल गोल्फ खेल रहे हैं? – pavium

+4

क्या इससे कोई फर्क पड़ता है कि आपके पास कितने बयान हैं? –

+0

मैं अपने कोड में कई तरह के कॉल है तो मैं एक उप कि SQL बयान और @params हो जाता है और गिनती देता है। अगर मेरे पास डीबीआई में अंतर्निहित बयान था तो मुझे अतिरिक्त उप की आवश्यकता नहीं है। मुझे लगता है कि यह एक आम उपयोग मामला है और मैं सोच रहा था कि ऐसा कोई बयान था या मुझे याद आया या यदि डीबीआई में ऐसा कोई बयान नहीं है। – szabgab

उत्तर

33

पर्याप्त आराम से बिना किसी अतिरिक्त चर के साथ एक पंक्ति में करने के लिए :

$count = $dbh->selectrow_array('SELECT count(*) FROM table WHERE...', undef, @params); 
+1

यह मेरा समाधान भी होगा। – MarkR

+1

यही वह है जिसे मैं ढूंढ रहा था। धन्यवाद! – szabgab

+0

डॉक्टर ने कहा कि आपको सूची संदर्भ में होना चाहिए, व्यक्तिगत रूप से मैं '(मेरी $ गिनती) = $ dbh-> selectrow_array (' तालिका से चयन करें (*) कहां से उपयोग करें ... ', undef, @params); ' –

3

मैं पर्ल पता नहीं है, लेकिन अगर यह वाक्य रचना तार्किक है मैं इस अपने 2 उदाहरण के आधार पर काम करेगा लगता होगा:

sub get_count { 
    return $dbh->selectall_arrayref("SELECT ...", undef, @params)->[0][0]; 
} 
+2

किसी ऐसे व्यक्ति के लिए अच्छा अनुमान जो पर्ल को नहीं जानता है। :) – friedo

+0

अच्छा है, हालांकि यह $ dbh-> selectall_arrayref ("चुनें ...", undef, @params) होना चाहिए -> [0] [0]; क्योंकि कॉल एक मैट्रिक्स देता है, न कि वेक्टर। (मुझे अपने मूल उदाहरण में एक ही गलती थी, लेकिन मैंने आपकी टिप्पणी के बाद इसे ठीक किया) – szabgab

+0

ठीक है, ठीक है। –

1

मैं शायद यह अपने आप ऐसा नहीं करेंगे, लेकिन आप हमेशा यह DBH वस्तु की एक नई उच्च-स्तरीय समारोह का उपयोग कर रहे बना सकता है:

चेतावनी: अनचाहे कोड निम्नानुसार है!

sub DBD::SQLite::db::count 
{ 
    my($dbh, $table, $where) = @_; 

    my($stmt) = "SELECT COUNT(*) FROM $table"; 
    $stmt .= " WHERE $where" if $where; 

    my($count) = $dbh->selectrow_array($stmt); 

    return $count; 

} 

और उसके बाद इस तरह इसे कहते हैं: एक नाम स्थान कि तुम्हारा नहीं है प्रदूषण इसके अलावा

my($cnt) = $dbh->count('Employee', 'year_hired < 2000'); 

, आप भी, आप का उपयोग हर डीबी ड्राइवर के लिए यह लिख दिया था, हालांकि मुझे यकीन है कि अपने कर रहा हूँ कुछ ऐसा काम कर सकता है जो आपको किसी दिए गए डीबीएच ऑब्जेक्ट के लिए इसे स्वतः कॉन्फ़िगर करने के लिए कुछ कोड बनाने और निकालने की अनुमति देता है।

+1

किसी और के नामस्थान को प्रदूषित करने के अलावा और आपके द्वारा उपयोग किए जाने वाले प्रत्येक डीबीडी के लिए इसे फिर से लिखने की आवश्यकता के साथ, समाधान के रूप में प्रस्तुत किए जाने वाले समाधान के लिए आपको मूल्यों को अलग करना होगा प्लेसहोल्डर्स ('year_hired

+0

अच्छा बिंदु; मुख्य टी हालांकि, इस पर भरोसा ओपी की टिप्पणी के जवाब में था, "अगर मेरे पास डीबीआई में अंतर्निहित बयान था"। –

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

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