我必须制作一个非常小而简单的脚本,根据这些标准填充表格中的字符串值:
程序将执行:
insert into table (code) values ('01');
insert into table (code) values ('02');
insert into table (code) values ('03');
insert into table (code) values ('04');
insert into table (code) values ('05');
insert into table (code) values ('06');
insert into table (code) values ('07');
insert into table (code) values ('08');
insert into table (code) values ('09');
insert into table (code) values ('0X');
依此类推,直到插入总共110个值。
我的代码(只是为了完成它,而不是最小化和提高效率)是:
use strict;
use DBI;
my ($db1,$sql,$sth,%dbattr);
%dbattr=(ChopBlanks => 1,RaiseError => 0);
$db1=DBI->connect('DBI:mysql:','','',\%dbattr);
my @code;
for(0..9)
{
$code[0]=$_;
for(0..9)
{
$code[1]=$_;
insert(@code);
}
insert($code[0],"X");
}
sub insert
{
my $skip=0;
foreach(@_)
{
if($skip==0)
{
$sql="insert into table (code) values ('".$_[0].$_[1]."');";
$sth=$db1->prepare($sql);
$sth->execute();
$skip++;
}
else
{
$skip--;
}
}
}
exit;
我只是想看到一个非常简洁的&这个逻辑的精确版本。
答案 0 :(得分:1)
第一部分可以简化为
for my $x (0..9) {
for my $y (0..9,'X') {
insert("$x$y");
}
}
我真的不明白$ skip在第二部分做了什么。我有
sub insert {
my $code = shift;
my $sql="insert into table (code) values ('$code');";
my $sth=$db1->prepare($sql);
$sth->execute();
}
答案 1 :(得分:1)
use DBI;$d=DBI->connect('DBI:mysql','','',{RaiseError=>1});for$a(0..9){for$b(0..9,'X'){$d->do("insert into table values('$a$b')");}}
use strict;use DBI;my$d=DBI->connect('DBI:mysql','','',{RaiseError=>1});for my$a(0..9){for my$b(0..9,'X'){$d->do("insert into table values('$a$b')");}}
use strict;use DBI;
my $d=DBI->connect('DBI:Informix:stores','','',{RaiseError=>1});
foreach my $a (0..9)
{
foreach my $b (0..9, 'X')
{
$d->do("insert into table values('$a$b')");
}
}
假设:
create table table(code char(2) not null);
和Perl:
use strict;
use DBI;
my $d=DBI->connect('DBI:mysql','','',{RaiseError=>1});
my $h=$d->prepare("insert into table(code)values(?)");
foreach my $a (0..9)
{
foreach my $b (0..9, 'X')
{
$h->execute("$a$b");
}
}
我使用Informix进行了测试,因此我实际使用的连接字符串是“DBI:Informix:stores
”。
此解决方案仍然可读 - 并且由于RaiseError,因此具有防错功能(除非您也想添加事务)。
Code Golfing it,它变成(182个字符):
use strict;use DBI;my$d=DBI->connect('DBI:mysql','','',{RaiseError=>1});my$h=$d->prepare("insert into table(code)values(?)");for my$a(0..9){for my$b(0..9,'X'){$h->execute("$a$b");}}
答案 2 :(得分:1)
您可以在sql中执行此操作(对于某些sql值):
insert into table (code) select concat(foo, bar)
from (select 0 foo union select 1 union select 2 union select 3 union select 4
union select 5 union select 6 union select 7 union select 8 union select 9)
foo
join (select 0 bar union select 1 union select 2 union select 3 union select 4
union select 5 union select 6 union select 7 union select 8 union select 9
union select 'X')
bar;