2009-11-01 17 views
16

Aşağıdaki kod tek bir sayı değeri almak için çok fazla gibi görünüyor. Düz DBI kullanarak tek bir COUNT değeri almak için önerilen daha iyi bir yol var mı?DBI ile bir veritabanından tek bir sayı değeri nasıl alabilirim?

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

    return $count; 
} 

Bu daha kısa, ancak hala iki tablom var.

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

Bu biraz özneldir. Bazıları, uzun örneğinizin daha okunabilir olduğunu söyleyebilir. Perl Golf oynuyor muyuz? – pavium

+4

Kaç tane deyiminiz var? –

+0

Kodumda bu tür çağrılarım var, bu yüzden SQL deyimini ve @params değerini alan ve sayımı döndüren bir altım var. DBI'de bunun için yerleşik bir deyim olsaydı, ekstra alt kısma ihtiyacım yok. Bence bu yaygın bir kullanım örneğidir ve böyle bir bildiri olup olmadığını merak ettim ve bunu özledim ya da DBI'da böyle bir ifade yoksa. – szabgab

cevap

33

:

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

Bu benim de çözümüm olurdu. – MarkR

+1

Aradığım şey bu. Teşekkürler! – szabgab

+0

Doküman, liste bağlamında olmanız gerektiğini belirtti, ben şahsen ben ($ sayım) = $ dbh-> selectrow_array ('SELECT count (*)' den WHERE ... ',' undef, @params '); –

3

Perl bilmiyorum ama sözdizimi mantıklı eğer bu senin 2 örneğine dayanarak çalışacak düşünürdüm: hiçbir ekstra değişkenler tek satırda yapmak için yeterli Kolay

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

Perl'i bilmeyen biri için iyi tahmin. :) – friedo

+0

güzel olsa da, $ dbh-> selectall_arrayref ("SELECT ...", undef, @params) olmalıdır -> [0] [0]; çağrı, bir vektör değil, bir matris döndürür. (Orijinal örneğimde aynı hatayı aldım ama yorumunuzdan beri düzeltdim) – szabgab

+0

Tamam, düzeltildi. –

1
muhtemelen bu kendim yapmazdım, ama her zaman kullandığınız o DBH nesnenin yeni bir üst düzey işlevi yapabilir

:

UYARI: test edilmemiş kodlar izler! Sonra

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; 

} 

ve böyle diyoruz:

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

ait olmayan bir ad kirletmeden yanında Seninkini eminim olsa da, kullandığınız her DB sürücü için bunu yazmak zorunda kalacak Belirli bir DBH nesnesi için bunu otomatik olarak yapılandırmak için bazı kodları oluşturmanıza ve değerlendirmenize izin veren bir şeyler çalıştırabilir.

+1

Başka birinin ad alanını kirletmekten ve kullandığınız her bir DBD için yeniden yazmanız gerektiğinden, sunulan çözüm değerleri ara değerlere aktarmanızı gerektirir Yer tutucuları ('year_hired

+0

İyi nokta; bunun bir itkisi de, OP'nin yorumuna yanıt olarak "DBI'de bunun için yerleşik bir bildirimde bulunsaydım" idi. –

İlgili konular