如何使用变量在mysql perl中创建子例程

时间:2013-02-28 22:31:27

标签: mysql perl hash subroutine

我有两个mysql命令。我想用这两个mysql命令创建一个子程序,用于我必须搜索的其余数据。我有很多条目。有没有办法创建一个子程序,以代替我在两个mysql命令中放入的实际数字和字符,我放入了可以替换的变量,这样我就可以复制并粘贴这些变量的实际值和命令是为其余的条目执行的?

例如,我有一个说

的命令
$sth = $dbh->prepare ("select name from table1 where number > 5");
$sth->execute();
@row;
while (@row = $sth->fetchrow_array) {
print "$row[0]\tquestion1\n";

代替select命令中列出的“5”和print命令中列出的“question1”,我想用“变量”代替它,这样我就可以在其中创建一个包含这些命令的子程序,但您执行并可以通过为这些变量插入不同的值来反复运行子例程。

类似这样:$ dbh = DBI-> connect($ dsn,$ user,$ password); 不确定如何为mysql perl做这个。

2 个答案:

答案 0 :(得分:2)

您可以在查询中使用placeholders在搜索中使用不同的值。

$sth = $dbh->prepare ("select name from table1 where number > ?");
$sth->execute(5);

在此之后,为您的打印制作子程序应该是微不足道的。

例如:

my @values = qw(5 10 15 20);
my @fields = qw(question1 question2);
# ... other code..
my $sth = $dbh->prepare ("select name from table1 where number > ?");

for my $field (@fields) {
    for my $value (@values) {
        printfields($sth, $value, $field);
    }
}

sub printfields {
    my ($sth, $value, $field) = @_;
    $sth->execute($value);
    while (my @row = $sth->fetchrow_array) {
        print "$row[0]\t$field\n";
    }
}

答案 1 :(得分:0)

我更喜欢在运行prepare()之前构建select查询。然后将其作为标量传递给prepare()。您还可以在标量中添加占位符(如果您不想仅为每个查询重建它),这些占位符可以通过调用s ///来轻松替换,也可以轻松命名/识别。这会使代码比将裸值传递给execute()更容易阅读。