gpt4 book ai didi

perl - Perl 中准备好的 SQL 语句

转载 作者:行者123 更新时间:2023-12-04 22:58:08 25 4
gpt4 key购买 nike

我对 Perl 很陌生,我正在努力克服最初的学习曲线。
我有以下 SQL 语句:

SELECT 
node_id
FROM
pagenodes
INNER JOIN
pageproducts
ON
pagenodes.node_id = pageproducts.nodeid
INNER JOIN
products
ON
pageproducts.prodid = products.prodid
WHERE
products.prodid = ?
LIMIT 1
如您所见,在查询中设置了 LIMIT 1,我正在尝试从 Perl 脚本执行此查询,并将结果设置为变量。
到目前为止,我有以下内容:
my $sql =
'SELECT
node_id
FROM
pagenodes
INNER JOIN
pageproducts
ON
pagenodes.node_id = pageproducts.nodeid
INNER JOIN
products
ON
pageproducts.prodid = products.prodid
WHERE
products.prodid = ?
LIMIT 1';

my $sth = $dbh->prepare($sql);
my $sth->execute();
我的问题是,我怎样才能通过 $prod_id作为 WHERE 参数,如何将结果设置为变量。谢谢

最佳答案

你已经很远了。很高兴您已经拥有 the placeholders ( ? ) .您需要做的就是传递参数as an argument to execute .它会按照它们在查询中出现的顺序自动将它们填充到占位符中。

use strict;
use warnings;
use DBI;

my $dbh = DBI->connect('dsn goes here', 'user', 'password') or die $DBI::errstr;

# stuff happens ...

my $prod_id = 1337; # or whatever

my $sql =
'SELECT
node_id
FROM
pagenodes
INNER JOIN
pageproducts
ON
pagenodes.node_id = pageproducts.nodeid
INNER JOIN
products
ON
pageproducts.prodid = products.prodid
WHERE
products.prodid = ?
LIMIT 1';

my $sth = $dbh->prepare($sql);
$sth->execute($prod_id); # no `my` here!
LIMIT在这种情况下没关系。它也将循环工作。

请注意,您有一个 myexecute前面线。那是错误的语法。 my用于声明变量,但在该行中,您仅在已存在的语句句柄对象上调用方法。 execute 有一个返回值方法,但它通常不分配给变量。如果返回值为真, execute那是成功的。如果是假的,那就是出了问题。您也可以使用 orcheck for errors .
$sth->execute or die $dbh->errstr;

现在要从数据库中获取您的单个值,您可以 use fetchrow_array in list context .
( my $node_id ) = $sth->fetchrow_array;

这会给你一个 node_id , 一次。

如果您打算只获取一个值并且只调用一次,您还可以节省一些代码行和 use selectrow_array instead .
( my $node_id ) = $dbh->selectrow_array('SELECT node_id FROM foo WHERE prodid=? LIMIT 1', undef, $prod_id);

同样,列表上下文很重要,因为 fetchrow_arrayselectrow_array返回列表,而不是数组引用。没有 ()在左侧,它将分配结果的数量(因为标量上下文)。

但是,如果您想在一个循环中为一堆值执行所有这些操作,它看起来有点不同。在这种情况下,请在循环之外进行准备,只需 executefetchrow_array (或任何其他 fetchrow_* 方法)在循环内。这将大大加快速度。
my $sth = $dbh->prepare($sql);
foreach my $prod_id ( @prod_ids ) {
$sth->execute($prod_id);
( my $node_id ) = $sth->fetchrow_array;
print "$node_id\n";
}

关于perl - Perl 中准备好的 SQL 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35696185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com