DBI的Forward Slash问题

时间:2015-07-16 21:43:16

标签: perl dbi

我不熟悉在perl脚本中使用DBI进行SQL查询。我遇到的问题与具有正斜杠的字段中的数据有关。我想使用变量作为我的where子句的输入,但它正在做DBI打算使用正斜杠来做的事情:停止查询。我试过很多不同的工作,从绑定,引用等,但没有一个工作,甚至可能吗?这方面的数据是一致的。带有my $ 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();

2 个答案:

答案 0 :(得分:6)

我不希望人们在SQL查询中使用变量插值。尝试使用占位符:

getApplicationContext().deleteFile(SHARE_HISTORY_FILE_NAME);
shareActionProvider.setShareHistoryFileName(SHARE_HISTORY_FILE_NAME);

答案 1 :(得分:4)

您已经为您的问题(use placeholders)提供了正确的解决方案,但您可能有兴趣了解为什么您所做的不起作用。

问题是你似乎误解了quote方法。 The documentation说:

  

引用字符串文字以用作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语句)会引导您朝着正确的方向前进。