2

我正在尝试在 pSQL 表中插入一行,同时将键和值指定为占位符:

my @keys = keys %db_entr;                                                            
my @vals = values %db_entr;

my @items = (@keys, @values);

my $dbh = DBI->connect("DBI:Pg:dbname=testdb;host=localhost", "username", 'password', {'RaiseError' => 1});                                                                   
my $sth = $dbh->prepare("INSERT INTO grid ( ?, ?, ? ) values ( ?, ?, ? )");
my $rows = $sth->execute(@items);                                                    
print "$rows effected\n";

但是,无论我做什么,这都会给我一个错误:

DBD::Pg::st execute failed: ERROR:  syntax error at or near "$1"
LINE 1: INSERT INTO grid ( $1, $2, ...
                           ^ at ./file.pl line 262, <STDIN> line 11.

有谁知道我可能做错了什么?

4

2 回答 2

6

您不能将占位符用于列名,如下所示:

INSERT INTO grid (?, ?, ?) VALUES (?, ?, ?)

您必须明确指定列名,并且只能对值使用占位符:

INSERT INTO grid (x, y, z) VALUES (?, ?, ?)
于 2013-01-08T10:13:27.280 回答
4

您不能在prepare调用中为列名使用占位符。您可以做的最好的事情是将变量名称插入到 SQL 字符串中,或​​者用于sprintf执行等效操作。

这是一个示例,但您可能需要做一些不同的事情。请注意,它会修改@items数组,并且prepare每次@items可能更改内容时都需要再次调用。

my $sth = $dbh->prepare(
    sprintf "INSERT INTO grid ( %s, %s, %s ) values ( ?, ?, ? )",
    splice @items, 0, 3
);
my $rows = $sth->execute(@items);
print "$rows affected\n";
于 2013-01-08T10:23:47.287 回答