MySQL操作程序六

返回

更新所有零件表的price1和price2(update_ptables.pl)

use strict; use DBI; my(%t,$n,@fld,@rec,$pref); # 连接数据库 $$pref{dsn} = "DBI:mysql:host=localhost;database=cookbook"; $$pref{dbh} = DBI->connect($$pref{dsn}, "cbuser", "cbpass") or die "Cannot connect to server\n"; $$pref{dbh}->do("SET NAMES utf8"); if(!$$pref{dbh}){ print "SQL read ERROR!\n"; exit; } # 取出main_type1的编号,同时生成零件表名 @{ $t{ptables} } = (); $t{sth} = $$pref{dbh}->prepare("SELECT id FROM main_type1"); $t{sth}->execute; while ( @rec = $t{sth}->fetchrow_array ) { $t{ptable1} = sprintf("%06d",$rec[0]); $t{ptable1} = 'a' . $t{ptable1}; push(@{ $t{ptables} },$t{ptable1}); } $t{sth}->finish; # 插入price1和price2 for $n ( 0 .. $#{ $t{ptables} } ) { $$pref{ptable1} = $t{ptables}[$n]; ($pref) = input_ptable1($pref); } # 关闭数据库 $$pref{dbh}->disconnect; print "Finished.\n"; sub input_ptable1 { my($pref) = @_; my(%t,$n); # price1赋值 $t{sql} = 'update ' . $$pref{ptable1}; $t{sql} .= ' set price1 = '; $t{sql} .= '"0=100=1=0000-00-00=1"'; $$pref{dbh}->do($t{sql}); # price2赋值 $t{sql} = 'update ' . $$pref{ptable1}; $t{sql} .= ' set price2 = '; $t{sql} .= '"0=100=1=0000-00-00=1=1"'; $$pref{dbh}->do($t{sql}); return($pref); } __END__;

更新一个零件表的price1和price2(update_ptable1.pl)

use strict; use DBI; my(%t,$n,@fld,@rec); # 输入主机序号,形成零件表名 print "Please input parts table name(Enginee.NO)="; chop($t{input}=<STDIN>); $t{inputf} = sprintf("%06d",$t{input}); $t{table1} = 'a' . $t{inputf}; # 连接数据库 $t{dsn} = "DBI:mysql:host=localhost;database=cookbook"; $t{dbh} = DBI->connect($t{dsn}, "cbuser", "cbpass") or die "Cannot connect to server\n"; $t{dbh}->do("SET NAMES utf8"); if(!$t{dbh}){ print "SQL read ERROR!\n"; exit; } # price1赋值 $t{sql} = 'update ' . $t{table1}; $t{sql} .= ' set price1 = '; $t{sql} .= '"0=100=1=0000-00-00=1"'; $t{dbh}->do($t{sql}); # price2赋值 $t{sql} = 'update ' . $t{table1}; $t{sql} .= ' set price2 = '; $t{sql} .= '"0=100=1=0000-00-00=1=1"'; $t{dbh}->do($t{sql}); $t{dbh}->disconnect;

取出一个零件表数据并写入中间文件(obtain_ptable1.pl)

## 需注意price1和price2的内容 use strict; use DBI; my(%t,$n,@fld,@rec,$pref); # 连接数据库 $$pref{dsn} = "DBI:mysql:host=localhost;database=cookbook"; $$pref{dbh} = DBI->connect($$pref{dsn}, "cbuser", "cbpass") or die "Cannot connect to server\n"; $$pref{dbh}->do("SET NAMES utf8"); if(!$$pref{dbh}){ print "SQL read ERROR!\n"; exit; } # 输入文件名 print "Please input number="; chop($t{number1}=<STDIN>); $t{number1} = sprintf("%06d",$t{number1}); $t{ptable1} = 'a' . $t{number1}; @{ $t{ptables} } = ($t{ptable1}); $$pref{ptable1} = $t{ptable1}; ($pref) = read_ptable($pref); $t{outputf} = $t{ptable1} . '.txt'; # 关闭数据库 $$pref{dbh}->disconnect; # 写入中间文件(../txt/ptables.txt) open(OUT,">../txt/$t{outputf}"); print OUT 'filename=ptables.txt',"\n"; print OUT 'C===file===id===name===code===dwg_id===Nuid===weight===price1===price2===memo',"\n"; for $n ( 0 .. $#{ $t{ptables} } ) { $$pref{ptable1} = $t{ptables}[$n]; ($pref) = write_ptable($pref); } close(OUT); sub write_ptable { my($pref) = @_; my (%t,$n); for $n ( 0 .. $#{ $$pref{id}{$$pref{ptable1}} } ) { $t{id} = $$pref{id}{$$pref{ptable1}}[$n]; $t{name} = $$pref{name}{$$pref{ptable1}}[$n]; # $t{name} =~ s/\x0D\x0A//g; # $t{name} =~ s/\x0D$//; # 改行符号去掉(如果有的话) $t{code} = $$pref{code}{$$pref{ptable1}}[$n]; # $t{code} =~ s/\x0D$//; # 改行符号去掉(如果有的话) $t{dwg_id} = $$pref{dwg_id}{$$pref{ptable1}}[$n]; $t{Nuid} = $$pref{Nuid}{$$pref{ptable1}}[$n]; print OUT 'PT===',$$pref{ptable1}; print OUT '===',$t{id}; print OUT '===',$t{name}; print OUT '===',$t{code}; print OUT '===',$t{dwg_id}; print OUT '===',$t{Nuid}; print OUT "\n"; } return($pref); } sub read_ptable { my($pref) = @_; my (%t,@rec); # 读零件表 $t{sth} = $$pref{dbh}->prepare("SELECT id,name,code,dwg_id,Nuid FROM $$pref{ptable1}"); $t{sth}->execute; while ( @rec = $t{sth}->fetchrow_array ) { push(@{ $$pref{id}{$$pref{ptable1}} },$rec[0]); push(@{ $$pref{name}{$$pref{ptable1}} },$rec[1]); push(@{ $$pref{code}{$$pref{ptable1}} },$rec[2]); push(@{ $$pref{dwg_id}{$$pref{ptable1}} },$rec[3]); push(@{ $$pref{Nuid}{$$pref{ptable1}} },$rec[4]); } $t{sth}->finish; return($pref); }

取出数据表一列数据并写入中间文件(obtain_table1.pl)

use strict; use DBI; my(%t,$n,@fld,@rec,$pref); # 连接数据库 $$pref{dsn} = "DBI:mysql:host=localhost;database=cookbook"; $$pref{dbh} = DBI->connect($$pref{dsn}, "cbuser", "cbpass") or die "Cannot connect to server\n"; $$pref{dbh}->do("SET NAMES utf8"); if(!$$pref{dbh}){ print "SQL read ERROR!\n"; exit; } # 指定数据库名 print "Please input database table name="; chop($t{table1}=<STDIN>); print "Please input number="; chop($t{number1}=<STDIN>); $t{outputf} = $t{table1} . '_' . $t{number1} . '.txt'; # 取出COLUMNS $t{sth} = $$pref{dbh}->prepare("SHOW COLUMNS FROM $t{table1}"); $t{sth}->execute; $t{column_list} = ''; while ( @rec = $t{sth}->fetchrow_array ) { push(@{ $t{columns_list} },$rec[0]); } $t{sth}->finish; # 取出所有数据并写入中间文件 open(OUT,">../txt/$t{outputf}"); print OUT "filename=$t{outputf}\n"; $t{line1} = join('===',@{ $t{columns_list} }); print OUT $t{table1}; print OUT '==='; print OUT $t{line1}; print OUT "\n"; $t{sth} = $$pref{dbh}->prepare("SELECT * FROM $t{table1}"); $t{sth}->execute; while ( @rec = $t{sth}->fetchrow_array ) { if ( $rec[0] == $t{number1} ) { $t{line1} = join('===',@rec); print OUT $t{table1}; print OUT '==='; print OUT $t{line1}; print OUT "\n"; } } $t{sth}->finish; close(OUT); # 关闭数据库 $$pref{dbh}->disconnect;

生成部分数据库零件表(make_lost_ptables.pl)

use strict; use DBI; my(%t,$n,@fld,$pref,@rec); # 连接数据库 $$pref{dsn} = "DBI:mysql:host=localhost;database=cookbook"; $$pref{dbh} = DBI->connect($$pref{dsn}, "cbuser", "cbpass") or die "Cannot connect to server\n"; $$pref{dbh}->do("SET NAMES utf8"); if(!$$pref{dbh}){ print "SQL read ERROR!\n"; exit; } # 取出数据 open(IN,"../txt/check_ptables.txt") or die "Can't open the file check_ptables.txt.\n"; $t{NO} = 0; while(<IN>){ if (/^PTABLE/) { chop; @fld = split(/===>/); if ( $fld[1] == 0 ) { $t{NO}++; push(@{ $t{ptables} },$fld[2]); } } } close(IN); print "NO=$t{NO},$#{ $t{ptables} }\n"; print "ptables=@{ $t{ptables} }\n"; # 生成零件表 for $n ( 0 .. $#{ $t{ptables} } ) { $$pref{ptable1} = $t{ptables}[$n]; ($pref) = ptable1($pref); } # 关闭数据库 $$pref{dbh}->disconnect; print "Finished.\n"; sub ptable1 { my($pref) = @_; my(%t); $t{sql} = 'DROP TABLE IF EXISTS ' . $$pref{ptable1} . ';'; $$pref{dbh}->do($t{sql}); $t{sql} = 'CREATE TABLE ' . $$pref{ptable1}; $t{sql} .= ' ('; $t{sql} .= 'id INT AUTO_INCREMENT,'; $t{sql} .= 'name TEXT,'; $t{sql} .= 'code TEXT,'; $t{sql} .= 'dwg_id INT,'; $t{sql} .= 'Nuid INT,'; $t{sql} .= 'weight INT,'; $t{sql} .= 'price1 TEXT,'; $t{sql} .= 'price2 TEXT,'; $t{sql} .= 'memo TEXT,'; $t{sql} .= 'PRIMARY KEY (id));'; $$pref{dbh}->do($t{sql}); return($pref); } __END__;

检查Ptables(check_ptables.pl)

use strict; use DBI; my(%t,$n,@fld,@rec,$pref); # 连接数据库 $$pref{dsn} = "DBI:mysql:host=localhost;database=cookbook"; $$pref{dbh} = DBI->connect($$pref{dsn}, "cbuser", "cbpass") or die "Cannot connect to server\n"; $$pref{dbh}->do("SET NAMES utf8"); if(!$$pref{dbh}){ print "SQL read ERROR!\n"; exit; } # 取出main_type1的最大id数量 $t{main_type1id_max} = $$pref{dbh}->selectrow_array("SELECT max(id) FROM main_type1"); # 对象文件(../txt/ptables.txt) open(IN,"../txt/ptables.txt"); while(<IN>){ if (/^PT/){ @fld = split(/===/); $t{plist}{$fld[1]} = $fld[1]; } } close(IN); @{ $t{ptables} } = sort keys %{ $t{plist} }; $t{ptable_list} = join(' ',@{ $t{ptables} }); # 关闭数据库 $$pref{dbh}->disconnect; open(OUT,">../txt/check_ptables.txt"); for $n ( 1 .. $t{main_type1id_max} ) { $t{ptable1} = sprintf("%06d",$n); $t{ptable1} = 'a' . $t{ptable1}; if ( $t{ptable_list} =~ /$t{ptable1}/) { print OUT "PTABLE===>1===>$t{ptable1}\n"; } else { print OUT "PTABLE===>0===>$t{ptable1}\n"; } }

检查TYPE(check_types.pl)

use strict; use DBI; my(%t,$n,@fld,$pref,@rec); # 连接数据库 $$pref{dsn} = "DBI:mysql:host=localhost;database=cookbook"; $$pref{dbh} = DBI->connect($$pref{dsn}, "cbuser", "cbpass") or die "Cannot connect to server\n"; $$pref{dbh}->do("SET NAMES utf8"); if(!$$pref{dbh}){ print "SQL read ERROR!\n"; exit; } # 取出main_type1的数据 $t{sth} = $$pref{dbh}->prepare("SELECT id,name FROM main_type1"); $t{sth}->execute; while ( @rec = $t{sth}->fetchrow_array ) { push(@{ $t{id_list} },$rec[0]); push(@{ $t{name_list} },$rec[1]); } $t{sth}->finish; # 关闭数据库 $$pref{dbh}->disconnect; open(OUT,">../txt/check_types.txt"); for $n ( 0 .. $#{ $t{id_list} } ) { $t{id1} = $t{id_list}[$n]; $t{name1} = $t{name_list}[$n]; if ( $t{names}{$t{name1}} ) { printf OUT ("%04d==>1==>%04d==>%s\n",$t{id1},$t{names}{$t{name1}},$t{name1}); } else { printf OUT ("%04d==>0==>0000==>%s\n",$t{id1},$t{name1}); } $t{NO} = $n + 1; $t{names}{$t{name1}} = $t{NO}; } close(OUT);
返回