首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DBI正向斜线问题

DBI正向斜线问题
EN

Stack Overflow用户
提问于 2015-07-16 21:43:16
回答 2查看 394关注 0票数 3

我刚开始在perl脚本中使用DBI进行SQL查询。我遇到的问题涉及到具有正斜杠的字段中的数据。我希望使用变量作为where子句的输入,但是它正在执行DBI想要做的事情:停止查询。我尝试了很多不同的工作,从绑定,引号等,但没有工作,甚至可能吗?这方面的数据是一致的。我的$sql变量的行是问题所在。

代码语言:javascript
复制
#!/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();
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-16 22:20:46

我不喜欢看到人们在SQL查询中使用变量插值。尝试使用占位符:

代码语言:javascript
复制
 [ 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 ]
票数 6
EN

Stack Overflow用户

发布于 2015-07-17 07:54:22

您已经获得了正确的问题解决方案(使用占位符),但您可能会感兴趣地了解为什么您所做的工作不起作用。

问题是您似乎误解了quote方法。文献资料说:

引用字符串文字,作为SQL语句中的文字值,方法是转义字符串中包含的任何特殊字符(例如引号),并添加所需类型的外部引号。

在这三行中使用quote

代码语言:javascript
复制
my $XCOD = $dbh->quote('cba');
my $a = $dbh->quote('abc');
my $b = $dbh->quote('123');

打印出$XCOD$a$b的值将有指导意义(因为$a$b实际上是变量的糟糕名称--除了它们的非描述性外,它们也是用于排序的特殊变量)。

我想你会看到"cba""abd""123"。该方法没有发现要转义的特殊字符,所以它所做的就是在字符串周围添加引号。

然后将这些值插入到SQL中。

代码语言:javascript
复制
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语句)将引导您朝着正确的方向前进。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31465047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档