如何为方法编写调度表?

时间:2015-05-27 23:02:02

标签: perl

我正试图摆脱我正在编写的用于处理if查询的子例程末尾的SELECT语句:

sub select_query {
  my ($params, $query, $return_type) = @_; 
  my $qh = $dbx->prepare($query);
  my $param_count = 1;
  foreach my $param (@$params) {
    $qh->bind_param($param_count++, $param);
  }
  $qh->execute;

  if ($return_type eq 'fetchrow_array') {
    return $qh->fetchrow_array;
  }
  if ($return_type eq 'fetchall_arrayref') {
    return $qh->fetchall_arrayref;
  }
  ... AND SO ON ...
}

我熟悉调度表调用不同子程序的想法。我可以用什么代码有效地调用$ qh句柄上的各种dbi方法?

2 个答案:

答案 0 :(得分:5)

您需要的只是$qh->$return_type(...)

如果您想验证,可以使用简单的查找表。

my @valid_return_types = qw( fetchrow_array ... );
my %valid_return_types = map { $_ => 1 } @valid_return_types;

die "..." if !$valid_return_types{$return_type};

答案 1 :(得分:0)

创建语句句柄后,您需要定义调度表。

my %dispatch  = (fetchall_arrayref => sub {return $_[0]->fetchall_arrayref},
                 fetchall_hashref  => sub {return $_[0]->fetchall_hashref('User')},
                 fetchrow_array    => sub {return $_[0]->fetchrow_array});

my $dbh = DBI->connect("DBI:mysql:mysql:localhost", 'root', 'password') or die;
my $sth = $dbh->prepare("select * from user");

foreach my $type (qw(fetchall_arrayref fetchall_hashref fetchrow_array)) {
    $sth->execute;
    print Dumper $dispatch{$type}->($sth);
}

<强>更新 实际上,让我做一个修正。如果您愿意,可以在创建语句句柄之前定义调度表。

<script src="js/bxslider.js"></script>