这是一个通过DBI接口向Oracle数据库插入数据的例子。
使用Perl操作Oracle数据库,除了标准的DBI模块外,还需安装特定的Oracle驱动模块,即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;
完毕。