【发布时间】:2018-11-12 19:35:18
【问题描述】:
我有多个查询需要执行,最多可达 100 行甚至更多行,我正在寻找最佳实践/简单的方法来将查询从模块导入我的主文件、绑定值并执行它们。示例:
Sql.pm
package Sql;
use strict;
use warnings;
use Exporter;
our @ISA = qw(Exporter);
our @EXPORT_OK = qw($query);
our $query = "SELECT *
FROM ?
";
main.pl
use strict;
use warnings;
use Sql;
#use DBI & connect ;
my $select = $Sql::query;
my $tbl= 'my_tbl';
my $sth = $dbh->prepare($select );
$sth->execute($tbl);
这会给我这个错误:
ct_result(ct_dynamic(CS_PREPARE)) 在 /usr/lib/x86_64-linux-gnu/perl5/5.22/DBD/Sybase.pm 第 138 行返回 -205。
DBD::Sybase::db 准备失败:服务器消息号=1087 严重性=16 状态=1 行=1 服务器=本地文本=必须声明表变量“@P1”。服务器消息编号=8180 严重性=16 状态=1 行=1 服务器=本地文本=无法准备语句。在 main.pl 第 16 行。
无法在 main.pl 第 17 行对未定义值调用方法“执行”。
如果我在我的 main.pl 中这样做
my $sth = $dbh->prepare($select);
$sth->bind_param(1, $tbl);
$sth->execute(1);
我收到同样的错误,但告诉我“无法在未定义的值上调用方法“bind_param””
我做错了什么? 有没有更好/简单/最佳实践的方法来实现我想要做的事情?
谢谢
【问题讨论】:
-
定义“有麻烦”。请发帖minimal reproducible example。
-
我已经编辑了主帖!感谢您的快速回复!
-
您的“麻烦”来自于它不知道如何准备您的语句,因此
$sth是未定义的,因此,$sth->...方法将无法说出Can't call method "..." on an undefined value。现在从metacpan.org/pod/distribution/DBI/… 的文档中可以看出,占位符在WHERE子句中的搜索值以及为列设置值时可以正常工作。但不适用于表名或列名,这就是您尝试做的 -
我明白了,我已将代码修改为: sql.pm our $query = "Select * from my_tbl where col = ?"; main.pl $tbl = '123' $sth->dbh->prepare($select) ; $sth->执行($tbl);这行得通,但这是一个好习惯吗?最佳做法是什么?
-
你可能想将你的 $tbl 重命名为 $val
标签: perl