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 に答える