====== 向数据库插入数据institutions-insert.pl ====== 这是一个通过DBI接口向Oracle数据库插入数据的例子。 ===== DBD-Oracle模块 ===== 使用Perl操作Oracle数据库,除了标准的[[http://search.cpan.org/~timb/DBI/DBI.pm|DBI]]模块外,还需安装特定的Oracle驱动模块,即[[http://search.cpan.org/~pythian/DBD-Oracle-1.52/lib/DBD/Oracle.pm|DBD-Oracle]],同时机器上已经安装好相应的Oracle客户端软件。 从源代码安装DBD-Oracle之前,先设置好与Oracle相关的环境变量,如: ORACLE_BASE=/db/oracle ORACLE_SID=kib ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1 PATH=$PATH:$ORACLE_HOME/bin LD_LIBRARY_PATH=$ORACLE_HOME/lib export ORACLE_BASE ORACLE_SID ORACLE_HOME PATH LD_LIBRARY_PATH 编译: tar xzvf DBD-Oracle-1.34.tar.gz cd DBD-Oracle-1.34/ perl Makefile.pl make 用root用户安装: make install ===== 表结构 ===== 涉及的数据库表结构如下: CREATE TABLE Institutions ( institution_id NUMBER(10) NOT NULL, name_cn VARCHAR2(128 CHAR) NOT NULL, name_en VARCHAR2(512 BYTE), address_cn VARCHAR2(256 CHAR), address_en VARCHAR2(1024 BYTE), website_cn VARCHAR2(128 CHAR), website_en VARCHAR2(512 BYTE), desc_cn VARCHAR2(1000 CHAR), desc_en VARCHAR2(4000 BYTE) ); ALTER TABLE Institutions ADD CONSTRAINT Institutions_primary_key PRIMARY KEY(institution_id); ===== 代码简述 ===== 使用DBI模块: use DBI; 设置用户名和密码,连接数据库: my $data_source = "dbi:Oracle:"; my $user = "dna"; my $passwd = "barcoding"; my $dbh = DBI->connect($data_source, $user, $passwd) or die "Can't connect to $data_source: $DBI::errstr"; 改为手工提交事物,因为一次要插入多行数据: $dbh->{AutoCommit} = 0; $dbh->{RaiseError} = 1; 将具体操作放在eval块里,以便捕获错误: eval { my $sth = $dbh->prepare( q{ INSERT INTO Institutions(institution_id, name_cn, name_en, website_cn, website_en) VALUES(?,?,?,?,?) }); while (<>) { $line++; chomp; my ($ins_id, $name_cn, $name_en, $website_cn, $website_en) = split /\t/; if ($ins_id eq "") { $flag++; print STDERR "$flag) Line[$line] ins_id($ins_id) is empty!\n"; } ... if (!$flag) { $sth->execute($ins_id, $name_cn, $name_en, $website_cn, $website_en); } } if ($flag) { print STDERR "Total $flag probleme(s), can't insert into database.\n"; $dbh->rollback; } else { $dbh->commit; } }; 如果期间出错,则回滚事物: if ($@) { warn "Transaction aborted becuase $@"; eval { $dbh->rollback }; } 断开数据库连接: $dbh->disconnect; 完毕。 {{tag>Perl}}