Yas*_*u G 1 sql perl placeholder dbi
我正在尝试为插入SQL编写prepare语句,它有很多行要一次插入.所以目前的准备声明如下,
my $sth = $dbh->prepare("INSERT INTO queues_details (id,keyword,data,flags) VALUES
(?,'penaltymemberslimit','0','0'),
(?,'answered_elsewhere','0','0'),
(?,'timeoutpriority','app','0'),
(?,'timeoutrestart','no','0'),
(?,'memberdelay','0','0'),
(?,'servicelevel','60','0'),
(?,'reportholdtime','no','0'),
(?,'ringinuse','yes','0'),
(?,'weight','0','0'),
(?,'autofill','no','0'),
(?,'eventmemberstatus','no','0'),
(?,'eventwhencalled','no','0'),
(?,'monitor-join','yes','0'),
(?,'monitor-format','','0'),
(?,'periodic-announce-frequency','0','0'),
(?,'queue-thankyou','queue-thankyou','0'),
(?,'queue-callswaiting','queue-callswaiting','0'),
(?,'queue-thereare','queue-thereare','0'),
(?,'maxlen','0','0'),
(?,'joinempty','yes','0'),
(?,'leavewhenempty','no','0'),
(?,'strategy','ringall','0'),
(?,'timeout','15','0'),
(?,'retry','5','0'),
(?,'wrapuptime','0','0'),
(?,'announce-frequency','60','0'),
(?,'announce-holdtime','no','0'),
(?,'announce-position','yes','0'),
(?,'queue-youarenext','queue-youarenext','0');");
Run Code Online (Sandbox Code Playgroud)
请注意,所有?值都是相同的id.
这是复杂的维护和努力添加/删除从行prepare和execute.这些占位符(?s)是否有任何编号方法,因此我可以轻松找到需要更改的行.
谢谢!
仅使用占位符
my $sql = "INSERT INTO queues_detail (id,keyword,data,flags) VALUES ";
$sql .= join ', ', ("(?,?,?,?)") x @data;
$dbh->do($sql, $undef, map { $id, @$_ } @data);
Run Code Online (Sandbox Code Playgroud)
或者根本不使用任何东西
my $sql = "INSERT INTO queues_detail (id,keyword,data,flags) VALUES ";
$sql .= join(', ', map { "(" . join(', ', map $dbh->quote($_), $id, @$_) . ")" } @data);
$dbh->do($sql);
Run Code Online (Sandbox Code Playgroud)
以上使用如下:
my @data = (
[ 'penaltymemberslimit', '0', 0 ],
[ 'answered_elsewhere', '0', 0 ],
[ 'timeoutpriority', 'app', 0 ],
[ 'timeoutrestart', 'no', 0 ],
[ 'memberdelay', '0', 0 ],
[ 'servicelevel', '60', 0 ],
[ 'reportholdtime', 'no', 0 ],
[ 'ringinuse', 'yes', 0 ],
[ 'weight', '0', 0 ],
[ 'autofill', 'no', 0 ],
[ 'eventmemberstatus', 'no', 0 ],
[ 'eventwhencalled', 'no', 0 ],
[ 'monitor-join', 'yes', 0 ],
[ 'monitor-format', '', 0 ],
[ 'periodic-announce-frequency', '0', 0 ],
[ 'queue-thankyou', 'queue-thankyou', 0 ],
[ 'queue-callswaiting', 'queue-callswaiting', 0 ],
[ 'queue-thereare', 'queue-thereare', 0 ],
[ 'maxlen', '0', 0 ],
[ 'joinempty', 'yes', 0 ],
[ 'leavewhenempty', 'no', 0 ],
[ 'strategy', 'ringall', 0 ],
[ 'timeout', '15', 0 ],
[ 'retry', '5', 0 ],
[ 'wrapuptime', '0', 0 ],
[ 'announce-frequency', '60', 0 ],
[ 'announce-holdtime', 'no', 0 ],
[ 'announce-position', 'yes', 0 ],
[ 'queue-youarenext', 'queue-youarenext', 0 ],
);
Run Code Online (Sandbox Code Playgroud)