0

我在从文件中读取的数组中有一组元素。现在我想在 sql 语句中使用这个数组值in Claus!因为我需要用'(单引号)括起来这些字符串。所以我试过了用 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' 但是有没有办法做到这一点?

4

3 回答 3

3

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

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

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

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

于 2013-04-15T11:16:18.320 回答
3

要使用占位符(即,正确地)执行此操作,您需要首先将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 的情况更加明显。)

于 2013-04-15T14:10:00.340 回答
2

这可能有效:

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

但是,以这种方式手动构建 SQL 是个坏主意™参数绑定是解决这个问题的正确方法。

于 2013-04-15T11:17:38.250 回答