DBI 的正斜杠问题

Forward Slash issue with DBI

我刚开始使用 DBI 在 perl 脚本中进行 SQL 查询。我遇到的问题与具有正斜杠的字段中的数据有关。我想使用变量作为我的 where 子句的输入,但它正在做 DBI 打算用正斜杠做的事情:停止查询。我尝试了绑定、引号等多种不同的解决方法,但 none 有效,这有可能吗?这里面的数据是一致的。我的 $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();

我不喜欢看到人们在 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 ]

您已获得问题的正确解决方案 (),但您可能有兴趣了解为什么您正在做的事情不起作用。

问题是您似乎误解了quote方法。 The documentation 是这样说的:

Quote a string literal for use as a literal value in an SQL statement, by escaping any special characters (such as quotation marks) contained within the string and adding the required type of outer quotation marks.

你在这三行中使用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 语句)可以引导您朝着正确的方向前进。