响水凹

欢迎来到 Guang-Wen Duan (Dennis Duan) 的个人 Wiki

用户工具

站点工具


computer:perl:institutions-insert

向数据库插入数据institutions-insert.pl

这是一个通过DBI接口向Oracle数据库插入数据的例子。

DBD-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;

完毕。

computer/perl/institutions-insert.txt · 最后更改: 2014/11/01 02:02 由 127.0.0.1