【问题标题】:In Perl, how do I properly quote string fragments I am using to build an SQL query? [duplicate]在 Perl 中,如何正确引用用于构建 SQL 查询的字符串片段? [复制]
【发布时间】:2013-04-15 10:27:15
【问题描述】:

我在从文件中读取的数组中有一组元素。现在我想在in Claus! 的 sql 语句中使用这个数组值,因为我需要用 '(单引号) 将这些字符串括起来.所以我试过用for循环来做到这一点!有没有办法做同样的opp?像 qw 之类的任何构建功能... 代码:

open FILE, "<tab_name.txt" or die $!;
my @tab=<FILE>;
chomp(@tab);
@tab=split(",",$tab[0]);#set of like eg:$tab[0]=asc,cdf,sad,casd,aea,aee,asdf 
my @sql_str=();
foreach my $item(@tab){

        $item="'".$item."'";
        push(@sql_str,$item);#add comma
         push(@sql_str,",");
}
pop(@sql_str);#remove lase unwanted comma

我得到了想要的输出,比如'asc','cdf','sad','casd','aea','aee','asdf' 但是有什么办法吗?

【问题讨论】:

  • 您不应该在 SQL 查询的值中使用引号。请改用占位符。
  • 您似乎正在尝试使用 IN 子句创建动态查询。如果值的数量是固定的,则创建一个模板。如果变量的数量不是 ocnstant,您将不得不使用准备语句并创建和执行动态 sql 语句。什么数据库?
  • @jim:oracle db 实际上,我正在尝试使用 sql plus 通过 perl 访问这个数据库
  • 因此,您最终会得到一个完整的 sql 语句字符串,例如“select * from table where fld1 in ('foo', 'bar', 'junk');” ?
  • 另见 Andy Lester 的优秀资源,Bobby-Tables.com。

标签: sql perl


【解决方案1】:

您需要一个数组,还是in 子句的字符串?我假设一个字符串是正确的,那么这个呢?

my $sql_str = join ",", map { $dbh->quote $_ } split ",", $tab[0];

但是Miguel Prz 是对的,你应该改用parameter binding!这将节省您的 Oracle 服务器,以便一遍又一遍地解析相同的 SQL 语句。

其他小问题。如果您使用my @tab=&lt;FILE&gt;;,它将读取整个文件。但是在代码中只使用了第一行。所以你可以使用my $tab = &lt;FILE&gt;; 来只读第一行。

【讨论】:

  • 如果你有一个数据库句柄,map { $dbh-&gt;quote($_) } 而不是map { "'$_'" } 以正确处理$_ 中的引号。
  • @Stefan Majewsky:谢谢,已更正。
【解决方案2】:

要使用占位符(即正确地)执行此操作,您需要首先将 IN 子句的所有值收集到一个数组 (@values) 中,以便知道其中有多少,然后:

my $in_clause = join(', ', ('?') x scalar @values);
my $sql_str = "select field1, field2 from my_table where id in ( $in_clause )";
my $sth = $dbh->prepare($sql_str);
$sth->execute(@values);

(scalar 在这里并不是绝对必要的,但包括在内是为了让 OP 发生的事情更加明显。)

【讨论】:

    【解决方案3】:

    这可能有效:

    my $sql_str = join ',' => map { $_ = qq|'$_'|; } @tab;
    

    但是,以这种方式手动构建 SQL 是一个坏主意™。 Parameter binding 是解决这个问题的正确方法。

    【讨论】:

    • 如果您在map 中使用$_ =,那么它会被就地编辑,因此不需要@tab =。
    • @TrueY,谢谢。用你的建议更新了我的答案
    • 这个=&gt;有点棘手,但,就够了。 $_ = 并不是真正需要的(除非你真的想修改 @tab)
    • @Miguel:干得好,伙计
    猜你喜欢
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 2013-06-29
    • 2012-07-26
    • 2012-01-17
    • 1970-01-01
    相关资源
    最近更新 更多