【问题标题】:How to create subroutine in mysql perl with variables如何在 mysql perl 中使用变量创建子例程
【发布时间】:2013-02-15 07:37:43
【问题描述】:

我有两个 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 执行此操作。

【问题讨论】:

    标签: mysql perl hash subroutine


    【解决方案1】:

    您可以在查询中使用 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";
        }
    }
    

    【讨论】:

    • 我希望手动将记事本中的值输入到占位符中,但我正在使用记事本条目中的这些信息对 mysql 表进行排序。无论如何要创建一个命令来运行子例程,这样我就可以将值复制并粘贴到命令中以进入占位符?
    • 记事本?多么可怕。复制/粘贴听起来更糟。是什么阻止您直接从文件中读取信息?在不确切知道您的输入内容的情况下很难推荐任何内容。
    • 是的,我应该澄清更多。我在 mysql 中有一个超过 170,000 个基因的表。在记事本中,我有一个由 4 列组成的列表:reg。元素,以及它们的染色体、起始位置、结束位置。我为 perl 制作了 mysql 命令以在最接近每个 reg 的 mysql 表中查找基因。元素。现在我必须为 reg 的其余部分找到最近的基因。记事本中列出的元素 - 其中有很多。
    • 嗯,很容易将文件加载到 perl 中。只需 open 文件,split 相应的行以提取列(或为您的文件格式使用适当的解析器)并将这些值插入到您的查询中。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-16
      相关资源
      最近更新 更多