====== 向数据库插入数据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}}