加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl中准备好的SQL语句

发布时间:2020-12-15 23:22:43 所属栏目:大数据 来源:网络整理
导读:我是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.pro
我是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无关紧要.它也可以循环工作.

请注意,您在执行行前面有一个my.这是错误的语法. my用于声明变量,但在该行中,您只调用已存在的语句句柄对象上的方法. execute方法有一个返回值,但通常不会将其赋值给变量.如果返回值为true,则执行成功.如果它是假的,那就出错了.您也可以使用或到check 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_array和selectrow_array返回列表,而不是数组引用.如果没有左侧的(),它将分配结果的数量(因为标量上下文).

但是,如果你想在循环中为一堆值做所有这些,它看起来有点不同.在这种情况下,请在循环外部进行准备,然后在循环内执行fetchrow_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_idn";
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读