除了?s之外的Perl DBI占位符

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.

这是复杂的维护和努力添加/删除从行prepareexecute.这些占位符(?s)是否有任何编号方法,因此我可以轻松找到需要更改的行.

谢谢!

ike*_*ami 6

仅使用占位符

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)