DBD-ShenTong常规操作

由于开发者并不直接使用DBD-ShenTong,而是通过perl-dbi与DBD-ShenTong交互,因此应用程序使用perl-dbi进行编程,perl-dbi是一个通用编程接口,他可以访问神通、Oracle、mysql等数据库,且调用方法保持一致。因此本文并不详细说明perl-dbi的各个类和方法,只做一些基本使用的说明。详细的perl-dbi类和方法说明,请查阅DBI官方文档。

变量名约定

以下设置了比较常用的变量名命名方法:

$dsn 驱动程序对象的句柄

$dbh 一个数据库对象的句柄

$sth 一个语句或者一个查询对象的句柄

$h 通用的句柄 ($dbh, $sth, 或 $drh),依赖于上下文

$rc 操作代码返回的布什值(true 或 false)

$rv 操作代码返回的整数值

@ary 查询返回的一行值的数组(列表)

$rows 操作代码返回的行数值

$fh 文件句柄

undef NULL 值表示未定义

%attr 引用属性的哈希值并传到方法上

数据库连接

使用DBI的connect方法连接数据库:

DBI->connect($dsn, $userid, $password );

connect方法要传入3个参数,每个参数的格式如下:

$dsn : 连接字符串,格式为:DBI:ShenTong:[IP]:[Port]/[dbname] ,DBI:ShenTong:为固定格式,IP为数据的ip地址,prot为端口名称,dbname为神通数据库的实例名称,dsn的示例如下:DBI:ShenTong:127.0.0.1:2003/OSRDB

$userid : 用户名

$password : 密码

完整的connect方法示例如下:

my $host = "localhost"; # 主机地址,默认为 localhost
my $port= "2003"; # 数据库端口
my $driver = "ShenTong"; # 接口类型
my $database = "OSRDB"; # 数据库

my $dsn = "DBI:$driver:$host:$port/$database";
my $userid = "SYSDBA"; # 数据库用户名
my $password = "szoscar55"; # 数据库密码

my $dbh = DBI->connect($dsn, $userid, $password ) or die $DBI::errstr;

安全连接

DBD-ShenTong依赖aci驱动,aci驱动支持了ssl安全通信,且可以通过连接字符串设置,因此DBD-ShenTong也可以在连接字符串设置ssl通信相关配置,多个参数之间用“;”间隔,比如:

my $dsn = "DBI:ShenTong:localhost:2003/OSRDB?ssl_wallet_enable=1;ssl_wallet_path=/opt/wallet/;ssl_wallet_pwd=szoscar55$";

详细可以设置的参数,可参考 《ACI (C/C++)程序员开发手册-->ACI编程概述-->参数配置文件-->参数说明》 中的参数及参数功能描述。

插入操作

执行步骤:

使用 prepare() API 预处理 SQL 语句;

使用 execute() API 执行 SQL 语句;

使用 finish() API 释放语句句柄;

最后如果一切顺利就会提交以上执行操作。

my $sth = $dbh->prepare("INSERT INTO Websites
                       (name, url, alexa, country )
                        values
                       ('Twitter', 'https://twitter.com/', 10, 'USA')");
$sth->execute() or die $DBI::errstr;
$sth->finish();
$dbh->commit or die $DBI::errstr;

应用程序还可以绑定输出和输入参数,下面例子通过用变量 取代 ? 占位符的位置来执行一条插入查询:

my $name = "baidu";
my $url = "https://baidu.com/";
my $alexa = 10;
my $country = "china";
my $sth = $dbh->prepare("INSERT INTO Websites
                       (name, url, alexa, country )
                        values
                       (?,?,?,?)");
$sth->execute($name,$url,$alexa, $country)
          or die $DBI::errstr;
$sth->finish();
$dbh->commit or die $DBI::errstr;

更新操作

执行步骤:

使用 prepare() API 预处理 SQL 语句;

使用 execute() API 执行 SQL 语句;

使用 finish() API 释放语句句柄;

最后如果一切顺利就会提交以上执行操作。

my $sth = $dbh->prepare("UPDATE Websites
                        SET   alexa = alexa + 1
                        WHERE country = 'CN'");
$sth->execute() or die $DBI::errstr;
print "更新的记录数 :" + $sth->rows;
$sth->finish();
$dbh->commit or die $DBI::errstr;

应用程序还可以绑定输出和输入参数,下面例子通过用变量取代 ? 占位符的位置来执行一条更新查询:

$name = '神舟通用';

my $sth = $dbh->prepare("UPDATE Websites
                        SET   alexa = alexa + 1
                        WHERE name = ?");
$sth->execute('$name') or die $DBI::errstr;
print "更新的记录数 :" + $sth->rows;
$sth->finish();

当然我们也可以绑定要设置的值,如下所示将 country 为 CN 的 alexa 都修改为 1000:

$country = 'CN';
$alexa = 1000:;
my $sth = $dbh->prepare("UPDATE Websites
                        SET   alexa = ?
                        WHERE country = ?");
$sth->execute( $alexa, '$country') or die $DBI::errstr;
print "更新的记录数 :" + $sth->rows;
$sth->finish();

删除操作

执行步骤:

使用 prepare() API 预处理 SQL 语句;

使用 execute() API 执行 SQL 语句;

使用 finish() API 释放语句句柄;

最后如果一切顺利就会提交以上执行操作。

以下数据将 Websites 中 alexa 大于 1000 的数据都删除:

$alexa = 1000;
my $sth = $dbh->prepare("DELETE FROM Websites
                        WHERE alexa = ?");
$sth->execute( $alexa ) or die $DBI::errstr;
print "删除的记录数 :" + $sth->rows;
$sth->finish();
$dbh->commit or die $DBI::errstr;

使用do执行语句

do语句可以执行 UPDATE, INSERT, 或 DELETE 操作,使用他比较简短,执行成功返回true,执行失败返回 false,实例如下:

$dbh->do('DELETE FROM Websites WHERE alexa>1000');

事务处理

DBD-ShenTong默认为手动提交,任何数据修改必须执行commit进行提交才能生效。

事务开始

用begin_work方法开启一个事务,这种方式就不需要在连接数据库的时候设置 AutoCommit = 0 。

$rc  = $dbh->begin_work  or die $dbh->errstr;
#######################这里执行一些 SQL 操作#####################
$dbh->commit;    # 成功后操作-----------------------------
$dbh->rollback;  # 失败后回滚

提交事务

commit 为提交事务,完成数据库的操作:

$dbh->commit or die $dbh->errstr;

回滚事务

如果在 SQL 执行过程中发生错误,可以回滚数据,不做任何改变:

$dbh->rollback or die $dbh->errstr;

事务自动提交

如果想设置为自动,可以在连接数据库时指定属性:

$dbh = DBI->connect($dsn, $userid, $password, {AutoCommit => 0}) or die $DBI::errstr;

以上代码在连接的时候设置了AutoCommit为false, 也就是说当你对数据库进行更新操作的时候, 它不会自动地把那些更新直接写到数据库里, 而是要程序通过 $dbh->commit 来使数据真正地写到数据库里, 或 $dbh->rollback 来回滚刚才的操作。

创建连接完成后,也可以修改是否为自动提交模式:

local $dbh->{AutoCommit} = 1;

断开连接

如果我们需要断开数据库连接,可以使用 disconnect 方法:

$rc = $dbh->disconnect  or warn $dbh->errstr;