我刚开始在perl脚本中使用DBI进行SQL查询。我遇到的问题涉及到具有正斜杠的字段中的数据。我希望使用变量作为where子句的输入,但是它正在执行DBI想要做的事情:停止查询。我尝试了很多不同的工作,从绑定,引号等,但没有工作,甚至可能吗?这方面的数据是一致的。我的$sql变量的行是问题所在。
#!/usr/bin/perl
# Modules
use DBI;
use DBD::Oracle;
use strict;
use warnings;
# Connection Info
$platform = "Oracle";
$database = "mydb";
$user = "user";
$pw = "pass";
# Data Source
$ds = "dbi:Oracle:$database";
my $dbh = DBI->connect($ds, $user, $pw);
# my $dbh = DBI->connect();
my $XCOD = $dbh->quote('cba');
my $a = $dbh->quote('abc');
my $b = $dbh->quote('123');
# tried this as well my $pid = $dbh->quote('$a/$b');
my $sql = "SELECT P_ID FROM MyTable WHERE P_ID=$a/$b AND XCOD=$XCOD";
my $sth = $dbh->prepare($sql);
$sth->execute();
my $outfile = 'superunique.txt';
open OUTFILE, '>', $outfile or die "Unable to open $outfile: $!";
while(my @re = $sth->fetchrow_array) {
print OUTFILE @re,"\n";
}
close OUTFILE;
$sth->finish();
$dbh->disconnect();发布于 2015-07-16 22:20:46
我不喜欢看到人们在SQL查询中使用变量插值。尝试使用占位符:
[ snip ]
my $P_ID = "$a/$b"
my $sql = "SELECT P_ID FROM MyTable WHERE P_ID = ? AND XCOD = ?";
my $sth = $dbh->prepare($sql);
$sth->execute($P_ID, $XCOD);
[ snip ]发布于 2015-07-17 07:54:22
您已经获得了正确的问题解决方案(使用占位符),但您可能会感兴趣地了解为什么您所做的工作不起作用。
问题是您似乎误解了quote方法。文献资料说:
引用字符串文字,作为SQL语句中的文字值,方法是转义字符串中包含的任何特殊字符(例如引号),并添加所需类型的外部引号。
在这三行中使用quote。
my $XCOD = $dbh->quote('cba');
my $a = $dbh->quote('abc');
my $b = $dbh->quote('123');打印出$XCOD、$a和$b的值将有指导意义(因为$a和$b实际上是变量的糟糕名称--除了它们的非描述性外,它们也是用于排序的特殊变量)。
我想你会看到"cba","abd"和"123"。该方法没有发现要转义的特殊字符,所以它所做的就是在字符串周围添加引号。
然后将这些值插入到SQL中。
my $sql = "SELECT P_ID FROM MyTable WHERE P_ID=$a/$b AND XCOD=$XCOD";同样,在执行此语句之后,您应该仔细查看$sql包含的内容。看起来会是这样的:
SELECT P_ID FROM MyTable WHERE P_ID="abc"/"123" AND XCOD="cba"
这可能是WHERE子句的第一部分是一个问题。甲骨文将其视为一个部门。当您将一个字符串除以另一个字符串时,谁知道Oracle会做什么。因此,您最终会寻找一个行,其中P_ID是一些奇怪的(可能是未定义的)值。
因此,这看起来是一个示例,其中最简单的调试技术(代码中的几个print语句)将引导您朝着正确的方向前进。
https://stackoverflow.com/questions/31465047
复制相似问题