代码之家  ›  专栏  ›  技术社区  ›  User1

在DBI上重复使用?'

  •  8
  • User1  · 技术社区  · 14 年前

    有没有一种方法可以重用DBI prepare语句中使用的。考虑以下代码:

    
    $sth=$dbh->prepare("INSERT INTO mytable(a,b,c) SELECT ?,B(?),C(?)");
    $sth->execute($a,$a,$a);
    

    
    #I'm making this up as something I hope exists
    $sth=$dbh->prepare("INSERT INTO mytable(a,b,c) SELECT ?,B(?:1),C(?:1)");
    $sth->execute($a);
    

    注意只有一个 $a 传递给execute而不是3。在现实生活中有没有办法做到这一点?

    4 回复  |  直到 14 年前
        1
  •  7
  •   hobbs    14 年前

    这取决于你的DBD。例如,将DBD::Pg与 $1 bind_param ? 占位符的样式在DBI范围内工作,这是不可能的。

        2
  •  4
  •   Ether    14 年前

    如果您使用库为您生成SQL语句,例如。 SQL::Abstract 或者一个完整的ORM DBIx::Class ,你就不用担心那样的事情了。

    或者,只需几行代码就可以执行类似的操作:

    my $sql = 'INSERT INTO ...blah blah... VALUES (' . (join(', ', ('?') x scalar(@insert_elements))) . ')';
    
        3
  •  3
  •   Community T.Woody    7 年前

    @霍布斯的 answer answer 是正确的——SQL抽象可以使这成为一个非问题。

    通常只需将每个不同的参数化值绑定一次 按姓名 对于查询的其余部分:

    my $sth = $dbh->prepare(<<'__eosql');
        INSERT INTO mytable(a,b,c)
                    SELECT x, B(x), C(x) FROM (SELECT ? AS x) subq
                                  -- Subquery may vary from DB to DB:
                                  --    "FROM (SELECT ? AS x FROM DUAL) subq"
                                  --    "FROM (SELECT ? FROM rdb$database) subq(x)"
                                  --    "FROM (VALUES (?)) subq(x)"
                                  -- etc.
    __eosql
    
    for $v (@values) {
        $sth->execute($v);
    }
    

    通常,这比另一种方法更加“有线高效”,因为用户提供的参数通常只传输一次,而不是一次 次。

        4
  •  2
  •   Despertar    8 年前

    可以在一条SQL语句中设置SQL变量,然后在下一个查询中多次使用该变量。

    $dbh->do('set @reusable = ?', undef, $perl_var);
    $dbh->select_arrayref('select * from table where cola = @reusable or colb = @reusable');
    

    没有重复的变量,您仍然可以获得参数化查询的安全性。